使用ViewHolder对ListView做优化

xiaoxiao2021-02-27  129

问题描述:Adapter给ListView做适配的时候,当List中条目数据过多时,会极大地消耗内存,即使复用convertView,还是需要每次都去找到convertView中的控件(findViewById方法)最后可能导致应用的崩溃,如何进行优化?

分析:现在已经可以复用convertView了,因此最好减少找到converiView内部控件的次数,因此可以创建一个ViewHolder容器,里面存放每个item里面的所有控件,并将这个类设为静态的,每当convertView为null时,则查找其内部的控件,给ViewHolder内的控件赋值;每当convertView不为null时,只要获取到之前设置给convertView的ViewHolder对象即可则直接复用该Holder中的控件,而无需重新进行控件的查找过程,以此达到优化的目的。

实现:

(1)现假设ListView每个条目的布局中有三个控件,分别是textView1,textView2,imageView1。因此构造一个ViewHolder静态类,包含这三个控件。

static class ViewHolder { TextView textView1; TextView textView2; ImageView imageView1; }(2)在重写BaseAdapter的getView()方法中,编写以下代码:

@Override public View getView(final int position, View convertView,ViewGroup parent) { // 复用ViewHolder步骤一 ViewHolder holder = null; if (convertView == null) { convertView = View.inflate(getApplicationContext(),R.layout.listview_XXX_item, null); // 2.减少findviewbyid的次数 holder = new ViewHolder(); holder.textView1= (TextView) convertView.findViewById(R.id.textView1); holder.textView2= (TextView) convertView.findViewById(R.id.textView2); holder.imageView1= (ImageView) convertView.findViewById(R.id.imageView1); // 将Holder对象设置给convertView convertView.setTag(holder); } else { //下次复用的时候直接将Holder对象取出来用,而无需寻找控件 holder = (ViewHolder) convertView.getTag(); }

转载请注明原文地址: https://www.6miu.com/read-15531.html

最新回复(0)