您的位置:首页 > 编程语言

ListView/gridView代码优化viewHolder精解--converView使用

2015-08-14 19:44 302 查看
大家都知道listview的使用,我们会在activity里面异步获取到一定的数据项再传给adapter,由adapter将数据与视图结合

在以前我也在写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, "*********************"));
}

}
}


——————————丝般柔顺——————————————
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: