浏览 14754 次
锁定老帖子 主题:ListView分页(带图片)显示用法案例
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-07-11
java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends android.widget.Adapter> ↳ android.widget.AbsListView ↳ android.widget.ListView android.widget.ListView继承了android.view.ViewGroup。 首先看一个纯文本的ListView例子,案例运行后会出现一个城市列表如图6-8所示,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。 ![]() 图6-8 ListView 程序代码请参考代码清单6-4: 【代码清单6-4】 chapter6_3/src/com/work/ListView_1_Activity.java public class ListView_1_Activity extends Activity { private ListView listview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_activity); listview = (ListView)findViewById(R.id.ListView01); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings); listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1_Activity.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 对于ArrayAdapter应该已经很熟悉了,其中的android.R.layout.simple_list_item_1是使用系统的布局样式。Android系统本身提供了很多的这样的布局文件,但是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是使用时需要注意的。 在这种方式下,需要在布局文件listview_activity.xml中添加ListView控件: <ListView android:id="@+id/ListView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView> 由于ListView在Android中是很常用的列表类型控件,只要是有多条信息需要显示的时候都可以考虑使用ListView展示出来,正是由于ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。 通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。同样上面案例如果使用ListActivity请参考代码清单6-5的写法: 【代码清单6-5】 chapter6_3/src/com/work/ListView_1.java public class ListView_1 extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings)); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 查看代码不难发现这里没有使用布局文件,那就意味着不需要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代码如下: getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); 另外一种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码如下所示。 @Override protected void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT) .show(); } 再看一个自定义Adapter的例子,这是一个带有图标的ListView,程序运行结果如图6-9所示。 ![]() 图6-9 自定义adapter 相关程序代码请参考代码清单6-6: 【代码清单6-6】 chapter6_3/src/com/work/ListViewIcon_3.java public class ListViewIcon_3 extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new EfficientAdapter(this)); } private static final String[] DATA = { "北京市", "天津市", "上海", "重庆", "哈尔滨", "石家庄", "秦皇岛", "济南", "青岛", "南京", "三亚", "昆明", "成都", "长沙", "武汉", "九江", "香港", "澳门","兰州","张家口" }; … } 自定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请参考代码清单6-7: 【代码清单6-7】 chapter6_3/src/com/work/ListViewIcon_3.java private static class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; private Bitmap mIcon0; private Bitmap mIcon1; … … public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon); mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing); … … } public int getCount() { return DATA.length; } public Object getItem(int position) { return DATA[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); switch(position) { case 0: holder.icon.setImageBitmap(mIcon1); break; case 1: holder.icon.setImageBitmap(mIcon2); break; … default: holder.icon.setImageBitmap(mIcon0); break; } return convertView; } static class ViewHolder { TextView text; ImageView icon; } } 编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法: • int getCount() 返回总数据源中总的记录数; • Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据; • long getItemId(int position) 根据选择的项目的位置; • View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。 这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。 if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView .findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } 只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-07-12
最后修改:2011-07-12
楼主上次介绍书,看了下简介,这次看了这个例子,看来都是实际的开发从而得来的经验,不过这示例没看到分页的?最近也在研究关于一种listview分页,学习一下。
|
|
返回顶楼 | |
发表时间:2011-10-18
关东升 写道 ListView是Android中最为常用的列表类型控件,ListView中的选择项目中样式很多有的是纯文字的、有的还可以带有图片。它的继承关系如下:
java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends android.widget.Adapter> ↳ android.widget.AbsListView ↳ android.widget.ListView android.widget.ListView继承了android.view.ViewGroup。 首先看一个纯文本的ListView例子,案例运行后会出现一个城市列表如图6-8所示,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。 ![]() 图6-8 ListView 程序代码请参考代码清单6-4: 【代码清单6-4】 chapter6_3/src/com/work/ListView_1_Activity.java public class ListView_1_Activity extends Activity { private ListView listview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_activity); listview = (ListView)findViewById(R.id.ListView01); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings); listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1_Activity.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 对于ArrayAdapter应该已经很熟悉了,其中的android.R.layout.simple_list_item_1是使用系统的布局样式。Android系统本身提供了很多的这样的布局文件,但是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是使用时需要注意的。 在这种方式下,需要在布局文件listview_activity.xml中添加ListView控件: <ListView android:id="@+id/ListView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView> 由于ListView在Android中是很常用的列表类型控件,只要是有多条信息需要显示的时候都可以考虑使用ListView展示出来,正是由于ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。 通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。同样上面案例如果使用ListActivity请参考代码清单6-5的写法: 【代码清单6-5】 chapter6_3/src/com/work/ListView_1.java public class ListView_1 extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings)); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 查看代码不难发现这里没有使用布局文件,那就意味着不需要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代码如下: getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); 另外一种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码如下所示。 @Override protected void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT) .show(); } 再看一个自定义Adapter的例子,这是一个带有图标的ListView,程序运行结果如图6-9所示。 ![]() 图6-9 自定义adapter 相关程序代码请参考代码清单6-6: 【代码清单6-6】 chapter6_3/src/com/work/ListViewIcon_3.java public class ListViewIcon_3 extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new EfficientAdapter(this)); } private static final String[] DATA = { "北京市", "天津市", "上海", "重庆", "哈尔滨", "石家庄", "秦皇岛", "济南", "青岛", "南京", "三亚", "昆明", "成都", "长沙", "武汉", "九江", "香港", "澳门","兰州","张家口" }; … } 自定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请参考代码清单6-7: 【代码清单6-7】 chapter6_3/src/com/work/ListViewIcon_3.java private static class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; private Bitmap mIcon0; private Bitmap mIcon1; … … public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon); mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing); … … } public int getCount() { return DATA.length; } public Object getItem(int position) { return DATA[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); switch(position) { case 0: holder.icon.setImageBitmap(mIcon1); break; case 1: holder.icon.setImageBitmap(mIcon2); break; … default: holder.icon.setImageBitmap(mIcon0); break; } return convertView; } static class ViewHolder { TextView text; ImageView icon; } } 编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法: • int getCount() 返回总数据源中总的记录数; • Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据; • long getItemId(int position) 根据选择的项目的位置; • View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。 这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。 if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView .findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } 只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。 |
|
返回顶楼 | |
发表时间:2011-10-19
很受用的帖子啊!系统学习下ListView的绝佳材料了!
|
|
返回顶楼 | |
发表时间:2011-10-20
不过为什么没有listview分页呢?希望学习一下
|
|
返回顶楼 | |
发表时间:2011-10-30
为什么木有分页的内容啊? lz是标题党
|
|
返回顶楼 | |
发表时间:2011-12-09
关东升 写道 ListView是Android中最为常用的列表类型控件,ListView中的选择项目中样式很多有的是纯文字的、有的还可以带有图片。它的继承关系如下:
java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends android.widget.Adapter> ↳ android.widget.AbsListView ↳ android.widget.ListView android.widget.ListView继承了android.view.ViewGroup。 首先看一个纯文本的ListView例子,案例运行后会出现一个城市列表如图6-8所示,选择某个城市,弹出一个Toast,关于Toast的概念和使用会在下一节中介绍。 ![]() 图6-8 ListView 程序代码请参考代码清单6-4: 【代码清单6-4】 chapter6_3/src/com/work/ListView_1_Activity.java public class ListView_1_Activity extends Activity { private ListView listview; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listview_activity); listview = (ListView)findViewById(R.id.ListView01); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings); listview.setAdapter(adapter); listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1_Activity.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 对于ArrayAdapter应该已经很熟悉了,其中的android.R.layout.simple_list_item_1是使用系统的布局样式。Android系统本身提供了很多的这样的布局文件,但是有的适合于ListView控件,有的适合于Spinner控件,有的适合于它的列表控件,这是使用时需要注意的。 在这种方式下,需要在布局文件listview_activity.xml中添加ListView控件: <ListView android:id="@+id/ListView01" android:layout_width="wrap_content" android:layout_height="wrap_content"></ListView> 由于ListView在Android中是很常用的列表类型控件,只要是有多条信息需要显示的时候都可以考虑使用ListView展示出来,正是由于ListView使用的普遍,所以Android又提供了一个列表类型的Activity——ListActivity,来简化ListView开发。 通过继承ListActivity类而实现一个简单的ListView功能,而不要直接使用ListView控件。同样上面案例如果使用ListActivity请参考代码清单6-5的写法: 【代码清单6-5】 chapter6_3/src/com/work/ListView_1.java public class ListView_1 extends ListActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mStrings)); getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); } private String[] mStrings = { "北京市", "天津市", "上海", "重庆", "乌鲁木齐", …}; } 查看代码不难发现这里没有使用布局文件,那就意味着不需要使用R文件来获得控件,所以在程序中使用了getListView()方法来获得ListView控件。处理ListView的项目点击事件有两种方法,一种是通过与ListView对象设置setOnItemClickListener方式实现,代码如下: getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int pos, long id) { Toast.makeText(ListView_1.this, mStrings[pos], Toast.LENGTH_SHORT).show(); } }); 另外一种是覆盖ListActivity的onListItemClick(ListView l, View v, int position, long id)方法实现,代码如下所示。 @Override protected void onListItemClick(ListView l, View v, int position, long id) { Toast.makeText(ListView_1.this, mStrings[position], Toast.LENGTH_SHORT) .show(); } 再看一个自定义Adapter的例子,这是一个带有图标的ListView,程序运行结果如图6-9所示。 ![]() 图6-9 自定义adapter 相关程序代码请参考代码清单6-6: 【代码清单6-6】 chapter6_3/src/com/work/ListViewIcon_3.java public class ListViewIcon_3 extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setListAdapter(new EfficientAdapter(this)); } private static final String[] DATA = { "北京市", "天津市", "上海", "重庆", "哈尔滨", "石家庄", "秦皇岛", "济南", "青岛", "南京", "三亚", "昆明", "成都", "长沙", "武汉", "九江", "香港", "澳门","兰州","张家口" }; … } 自定义的Adapter是EfficientAdapter,EfficientAdapter的相关代码请参考代码清单6-7: 【代码清单6-7】 chapter6_3/src/com/work/ListViewIcon_3.java private static class EfficientAdapter extends BaseAdapter { private LayoutInflater mInflater; private Bitmap mIcon0; private Bitmap mIcon1; … … public EfficientAdapter(Context context) { mInflater = LayoutInflater.from(context); mIcon0 = BitmapFactory.decodeResource(context.getResources(), R.drawable.noicon); mIcon1 = BitmapFactory.decodeResource(context.getResources(), R.drawable.beijing); … … } public int getCount() { return DATA.length; } public Object getItem(int position) { return DATA[position]; } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.text.setText(DATA[position]); switch(position) { case 0: holder.icon.setImageBitmap(mIcon1); break; case 1: holder.icon.setImageBitmap(mIcon2); break; … default: holder.icon.setImageBitmap(mIcon0); break; } return convertView; } static class ViewHolder { TextView text; ImageView icon; } } 编写自定义Adapter可以继承BaseAdapter类,如果是数据库使用可以继承CursorAdapter。在本例中继承了BaseAdapter类,BaseAdapter是一个抽象类,必须在它的子类中实现下面的方法: • int getCount() 返回总数据源中总的记录数; • Object getItem(int position) 根据选择的项目的位置,获得选择的数据源中某个项目的数据; • long getItemId(int position) 根据选择的项目的位置; • View getView(int position, View convertView, ViewGroup parent) 获得要展示的项目View对象。 这里最为麻烦的方法就是getView(),getView()方法是ListView的每个列表项目绘制在屏幕上时被调用。该方法其中的一个参数是convertView,在ListView第一次显示列表项目的时候,convertView是null值。当向上滑动屏幕时候,屏幕上面的列表项目退出屏幕,屏幕下面原来不可见的列表项目会进入屏幕,这个时候的convertView不是null值,下面代码的处理对于提供ListView控件提高性能是至关重要的。 if (convertView == null) { convertView = mInflater.inflate(R.layout.main, null); holder = new ViewHolder(); holder.text = (TextView) convertView .findViewById(R.id.textview); holder.icon = (ImageView) convertView.findViewById(R.id.icon); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } 只有在convertView为null时才去实例化控件,创建convertView对象、holder对象,其中convertView对象是通过mInflater.inflate(R.layout.main, null)方法,从一个main.xml布局文件中加载并创建的。 而在convertView非null的时候不会实例化控件,否则每次都要实例化控件,当列表项目很多时,用户反复滑动屏幕会有“卡”的感觉,不再流畅了。 ViewHolder类是将每一个项目中的控件封装起来的类,可以在convertView 为null时候创建ViewHolder类的实例holder,然后通过convertView.setTag(holder);把它放到convertView中,而在convertView非null时候,再通过convertView.getTag()过的一个ViewHolder类的实例,这样在翻屏的时候就不会反复创建ViewHolder实例对象了,就本例而言只是创建了9个ViewHolder实例。 哎呦我去,想找点资料找到咱关老师帖子里了。。支持个~ |
|
返回顶楼 | |