Styling Item Views In Android Listview
Solution 1:
I would start smaller, by revisiting your adapter. The ListView itself is very simple - in your activity layout, you set your ListView to be match_parent
for both width and height.
The adapter is the component which creates each row, which in ListAdapter, is initiated by the getView()
method.
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {
if (convertView != null) {
convertView.setBackgroundResource(R.drawable.list_selector);
}
TextViewtextView= getGenericView();
textView.setBackgroundResource(R.drawable.list_selector);
textView.setText(contacts.get(position).getName());
return textView;
}
Note what you're doing here is incorrect; you do something to convertView
but then you ignore it, and just make a new View. The pattern is more like:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {
ViewrowView= convertView;
if (rowView == null) {
rowView = // create a new View that represents your row
}
// bind the data to rowView, then return itreturn rowView;
}
which in your case might be:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {
TextViewrowView= (TextView) convertView;
if (rowView == null) {
rowView = getGenericView();
rowView.setBackgroundResource(R.drawable.list_selector);
}
rowView.setText(contacts.get(position).getName());
return rowView;
}
See, you only need to create rowView
if it's null. Also, the background only needs to be set once (and this can be done in XML if you want).
With creating the row View, I'd recommend starting by inflating a layout that contains a single TextView as the only element.
view_item_contact.xml:
<?xml version="1.0" encoding="utf-8"?><TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content" />
then your getGenericView()
can be renamed to createContactRowView()
:
private TextView createContactRowView(ViewGroup parent) {
LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
return ((TextView) layoutInflater.inflate(R.layout.view_item_contact, parent, false));
}
From there, you can start to style your row in view_item_contact.xml
by adding padding, setting a minimum height, centering the text vertically by applying gravity, etc.
view_item_contact.xml:
<?xml version="1.0" encoding="utf-8"?><TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:minHeight="48dp"android:gravity="center_vertical"android:paddingLeft="16dp"android:paddingRight="16dp"android:background="@drawable/list_selector" />
In almost all cases, I would avoid creating Views programmatically - always inflate them from XML, so you can separate styles and layout from your logic.
Post a Comment for "Styling Item Views In Android Listview"