Introduction
There are some situations when Android Application Developers need to customize a listview. To customize a ListView
, you need to customize Adapter
of the ListView
. Without an Adapter, you cannot implement a dynamic ListView
. The Adapter
will inherit BaseAdapter
class of Android, you can manage everything inside the Adapter
class. Those who have basic knowledge of Android can easily understand this tip.
Background
I faced a lot of situations where I had to implement dynamic ListView
which changes according to user's input.
Using the Code
Here, I am going to show how a ListView
of some Members can be generated. The YourAdapter
class extends BaseAdapter
and Override
some methods of it. The getView
method returns a View
, so be very careful about that. The YourAdapter
constructor receives the context of the Activity, the data as a ArrayList
. You may use List
rather than ArrayList
but I have used this for a purpose. And the third parameter is the size of the listview
. After that, inside getView()
method, here are some checkings which change the ListView
dynamically. You can change the background of the items of list. You can change the textView
or ImageView
or EditText
or anything of the ListItem
. For this, I put the ListItem
as a Linear Layout.
I have set proper comments beside the code snippets, so you can have an idea about what is going on here.
class YourAdapter extends BaseAdapter {
Context context;
ArrayList aL;
int count = 0;
int limit;
private LayoutInflater inflater = null;
public YourAdapter(Context context, ArrayList aL, int size) {
this.context = context;
this.aL = aL;
this.limit = size;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return limit;
}
@Override
public Object getItem(int position) {
return this.aL.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return getCount();
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
LinearLayout lL = null;
if (vi == null) {
vi = inflater.inflate(R.layout.list_item,
null);
}
lL= (LinearLayout) vi.findViewById(R.id.linearLayoutList);
TextView data = (TextView) lL.findViewById
(R.id.textListItem);
ImageView memberIcon =
(ImageView) lL.findViewById(R.id.maleOrFemale);
ArrayList savedPositions = db.getTempData();
List<Integer> loanDepositAmount =
db.getLoanInfoOfMembers();
List<String> genderList =
db.getAllGenderOfMembers();
for (int i = 0; i < genderList.size(); i++) {
if (position == i) {
String maleOrFemale = "";
try {
maleOrFemale = genderList.get(position).toString();
} catch (Exception e) {
e.toString();
}
if (maleOrFemale.equals("Female")) {
memberIcon.setBackgroundResource(R.drawable.female);
} else {
memberIcon.setBackgroundResource(R.drawable.male);
}
if (newMembers.get(position).toString().contains("New")) {
data.setTextColor(Color.parseColor
("#086A87"));
}
if (position == loanDepositAmount.get(i)) {
data.setTextColor(Color.parseColor
("#FE2E2E"));
}
}
}
for (int i = 0; i < savedPositions.size(); i++) {
if (position == Integer.parseInt(savedPositions.get(i)
.toString())) {
rL.setBackgroundDrawable(new ColorDrawable(Color
.parseColor("#31B404")));
}
}
data.setText(newMembers.get(position).toString());
return vi;
}
}
After creating the customized adapter
class, you need to set this in a ListView
. Suppose there's a ListView
named listMembers
, then:
ArrayList memberData;
ListView listMembers;
DatabaseHelper db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_activity_layout);
memberData= new ArrayList<String>();
listMembers = (ListView)
findViewById(R.id.listViewMembers);
db = new DatabaseHelper(getApplicationContext());
memberData = db.getAllMembers();
listMembers.setAdapter(new YourAdapter
(YourClass.this, memberData, memberData.size()));
}
You can change the size according to user's input also, suppose you select Male
from a ComboBox
, then only Male Member's data will be shown. The output is like this image for this scenario:
Points of Interest
There are a lot of things, I had so much fun while implementing these. I removed other data validations and threading from the code for clear understanding. There, you can set a lot of checkings and change items of the ListView
as per your desire.