I’m attempting to create a ListView adapter that has multiple types of views. I’m following the following tutorial:
http://android.amberfog.com/?p=296
However, after the first round of building the following code:
public class MultipleItemList extends Activity
{
private MyCustomAdapter mAdapter;
private ListView mListView;
private String mTag = "MultipleItemList";
@Override
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
setContentView( R.layout.main );
mListView = (ListView)findViewById( R.id.main_list );
mAdapter = new MyCustomAdapter();
for( int i = 0; i < 50; i++ )
{
mAdapter.addItem( "Item: " + i );
}
mListView.setAdapter( mAdapter );
}
private class MyCustomAdapter extends BaseAdapter
{
private ArrayList<String> mData = new ArrayList<String>();
private LayoutInflater mInflater;
public MyCustomAdapter()
{
mInflater = (LayoutInflater)getSystemService( Context.LAYOUT_INFLATER_SERVICE );
}
public void addItem( final String item )
{
mData.add( item );
notifyDataSetChanged();
}
public int getCount()
{
return mData.size();
}
public String getItem( int position )
{
return mData.get( position );
}
public long getItemId( int position )
{
return position;
}
public View getView( int position, View convertView, ViewGroup parent )
{
Log.e( mTag, "getView: " + position + " " + convertView );
ViewHolder holder = null;
if( convertView == null )
{
convertView = mInflater.inflate( R.layout.list_item, null );
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById( R.id.item_text );
convertView.setTag( holder );
}
else
{
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText( mData.get( position ) );
return convertView;
}
}
public static class ViewHolder
{
public TextView textView;
}
}
Where the main.xml is:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/main_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</ListView>
</LinearLayout>
And the list_item.xml is:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/item_text"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:text="TextView"
android:gravity="center_vertical"
android:paddingLeft="25dp"/>
</LinearLayout>
I’d expect the output to be similar to his expected output:
02-05 13:47:32.559: INFO/System.out(947): getView 0 null
02-05 13:47:32.570: INFO/System.out(947): getView 1 null
02-05 13:47:32.589: INFO/System.out(947): getView 2 null
02-05 13:47:32.599: INFO/System.out(947): getView 3 null
02-05 13:47:32.619: INFO/System.out(947): getView 4 null
02-05 13:47:32.629: INFO/System.out(947): getView 5 null
02-05 13:47:32.708: INFO/System.out(947): getView 6 null
02-05 13:47:32.719: INFO/System.out(947): getView 7 null
02-05 13:47:32.729: INFO/System.out(947): getView 8 null
But instead, with no user interaction, just loading the screen, I’m getting the following:
05-09 15:24:00.347: E/MultipleItemList(11109): getView: 0 null
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 1 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 2 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 3 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 4 android.widget.LinearLayout@413304d0
05-09 15:24:00.357: E/MultipleItemList(11109): getView: 5 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 6 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 7 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 8 android.widget.LinearLayout@413304d0
05-09 15:24:00.367: E/MultipleItemList(11109): getView: 9 android.widget.LinearLayout@413304d0
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 0 android.widget.LinearLayout@413304d0
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 1 null
05-09 15:24:00.407: E/MultipleItemList(11109): getView: 2 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 3 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 4 null
05-09 15:24:00.417: E/MultipleItemList(11109): getView: 5 null
05-09 15:24:00.427: E/MultipleItemList(11109): getView: 6 null
05-09 15:24:00.427: E/MultipleItemList(11109): getView: 7 null
05-09 15:24:00.437: E/MultipleItemList(11109): getView: 8 null
05-09 15:24:00.437: E/MultipleItemList(11109): getView: 9 null
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 0 null
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 1 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 2 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 3 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 4 android.widget.LinearLayout@41338b60
05-09 15:24:00.457: E/MultipleItemList(11109): getView: 5 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 6 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 7 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 8 android.widget.LinearLayout@41338b60
05-09 15:24:00.467: E/MultipleItemList(11109): getView: 9 android.widget.LinearLayout@41338b60
Why on earth is there so much work going into rendering the first 10 items in the list?
The differences between the calls to
getViewseen in yourActivityand the calls togetViewseen in the tutorial occur because the tutorial uses aListActivity. There is some underlying difference in the wayAdaptersget called when using the different activity classes.I took the code in the code in your question and was able to reproduce the logs you reported. When I changed it to extend from a
ListActivityI was able to reproduce the logs seen in the tutorial.Looking into the StackTraceElements for the
getView()I can see the following:Activity Log
ListActivity.log
So my answer would be that there are key differences in the way
ListViewsin the different activity types are populated/rendered and this causes the differences in the amount of calls togetView.