ListView/gridView代码优化viewHolder精解--converView使用
2015-08-14 19:44
302 查看
大家都知道listview的使用,我们会在activity里面异步获取到一定的数据项再传给adapter,由adapter将数据与视图结合
在以前我也在写adapter的时候遇到很多问题,这篇也是精要的写明listView和gridView里面viewHolder和converView的使用
先附上adapter代码—–就几行,比较简单,明了
getView() 方法是 ListView 或者 gridView 获取 View 的代码。gridView是根据getCount返回的值来确定行数的—-getCount 返回0就不显示 listView 和 gridView
当我们数据量大的时候也就意味着 ListView 可能要显示成百上千行–如果我们不使用进行代码优化 那么就会每一加载一个view 就会调用一次-inflate-findViewById-
这无疑会让我们的程序卡顿-滑动多了还会out of memory-
那来看解决方法我们来看看converView是什么—–它是android提供的,当listView里面的view移除屏幕后重复使用的view—也就是一个listView 有10000+项—adapter一共就屏幕上能显示的item那么多项实例View 如下图所示
这个Holder的属性是我们加载的布局 里面的组件实体,也就是我们要显示的item里的小组件
为了避免重复加载布局文件和组件然后在每一个要显示View里面 setTag(Holder)(View的Tag属性,可携带对象和键-值对,不知道自行百度)
当他铺满了,返回一个converView—因为这个converView 就是我们屏幕上被移除的View
所以每一个View的 Tag 里面都有我们放进去的holder我们只需要getTag就可以获得holder也就是不再需要加载布局及findView了
最后附上MainActivity代码
——————————丝般柔顺——————————————
在以前我也在写adapter的时候遇到很多问题,这篇也是精要的写明listView和gridView里面viewHolder和converView的使用
先附上adapter代码—–就几行,比较简单,明了
public class ListViewAdapter extends BaseAdapter { Context context; List<ListViewItem> list;// 闯过来的数据 public int getCount() { return list.size(); } public ListViewAdapter(Context context, List<ListViewItem> list) { super(); this.context = context; this.list = list; } public Object getItem(int position) { return null; } public long getItemId(int position) { return 0; } public View getView(int position, View convertView, ViewGroup parent) { Holder holder; // 这个converView和holder是什么?---查看底部说明 if (convertView == null) { holder = new Holder(); convertView = LayoutInflater.from(context).inflate(R.layout.listview_item, null); holder.title = (TextView) convertView.findViewById(R.id.tv_title); holder.text = (TextView) convertView.findViewById(R.id.tv_text); convertView.setTag(holder); } else { holder = (Holder) convertView.getTag(); } // 设置---item的标题---文本 holder.title.setText(list.get(position).title); holder.text.setText(list.get(position).text); return convertView; } class Holder { TextView title; TextView text; } }
getView() 方法是 ListView 或者 gridView 获取 View 的代码。gridView是根据getCount返回的值来确定行数的—-getCount 返回0就不显示 listView 和 gridView
当我们数据量大的时候也就意味着 ListView 可能要显示成百上千行–如果我们不使用进行代码优化 那么就会每一加载一个view 就会调用一次-inflate-findViewById-
这无疑会让我们的程序卡顿-滑动多了还会out of memory-
那来看解决方法我们来看看converView是什么—–它是android提供的,当listView里面的view移除屏幕后重复使用的view—也就是一个listView 有10000+项—adapter一共就屏幕上能显示的item那么多项实例View 如下图所示
回来细看代码:
当converView==null——也就是屏幕上还没铺满item时 我们就加载item的布局文件,及findView布局文件里面的View 并且创建holder这个Holder的属性是我们加载的布局 里面的组件实体,也就是我们要显示的item里的小组件
为了避免重复加载布局文件和组件然后在每一个要显示View里面 setTag(Holder)(View的Tag属性,可携带对象和键-值对,不知道自行百度)
当他铺满了,返回一个converView—因为这个converView 就是我们屏幕上被移除的View
所以每一个View的 Tag 里面都有我们放进去的holder我们只需要getTag就可以获得holder也就是不再需要加载布局及findView了
最后附上MainActivity代码
public class MainActivity extends Activity { private List<ListViewItem> dataList;// listView 使用的数据 private ListView listView; private ListViewAdapter listViewAdapter;// listView 数据的适配器 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView();// 获取组件 loadData();// 加载数据 listView.setAdapter(listViewAdapter);// 设置适配器---传入context---传入数据 } private void findView() { dataList = new ArrayList<ListViewItem>(); listView = (ListView) findViewById(R.id.list_view); listViewAdapter = new ListViewAdapter(this, dataList); } // 加载数据项 private void loadData() { for (int i = 0; i < 20000; i++) { dataList.add(new ListViewItem("Title: " + i, "*********************")); } } }
——————————丝般柔顺——————————————
相关文章推荐
- C# axWindowsMediaPlayer制作播放器
- C语言-母牛和兔子的问题
- python:元组和小括号的误导
- Yii2学习之ActiveRecord
- MQTT broker and client
- 05 数字 - 《Python 核心编程》
- 11.PHP 教程_PHP Switch 语句
- php最简单的注入与最简单的避免方式
- C# DataGridView显示行号方法。
- 10.PHP 教程_PHP If...Else 语句
- C# 、Vb .Net 中 Datagridview显示行号方法。
- C++ 运算符重载(二)
- Qt打包生成exe程序
- 登录注册代码
- 谷歌三大核心技术(一)Google File System中文版
- c++运算符重载总结
- JAVA的反射机制
- 用户登陆登出日志
- 脱离 Spring 实现复杂嵌套事务,之一(必要的概念)
- 编写高质量代码改善C#程序的157个建议——建议24:迭代器应该是只读的