按照普通的写法,如果ListView里面有比较多的东西的话,在加载每一个Item的时候,是非常非常卡的。具体表现就是滚动起来的时候会看见明显的卡顿。
关键还是处理自定义Adapter里面的getView函数,毕竟这个函数才是绘制Item的。
//观察getView函数,发现是有View convertView这个参数 public View getView(int position, View convertView, ViewGroup parent)
//如果convertView不为空的话,就是说这个Item的View已经是绘制过的了,我们直接view = convertView就好,不用再重新对View进行加工了。 if(convertView == null){ view = LayoutInflater.from(getContext()).inflate(resouceID,null); //省略 }else{ view = convertView; }
进一步优化:
可以自定义一个ViewHolder类,然后这个类的成员变量全是Item里面要用到的控件,用这个类来缓存Item的控件。用View.setTag(viewHolder)和View绑定,
如果convertView非空的时候,直接把里面的控件取出来就好了,不需要再次findViewByID一次。
假设Item里面有一个TextView,一个Button。
class ViewHolder{ TextView tv; Button bt; }
在getView里面:
public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder viewHolder; //没有绘制过的话 if(convertView == null){ view = LayoutInflater.from(getContext()).inflate(resouceID,null); viewHolder = new ViewHolder(); //把所有控件弄进ViewHolder里面保存 viewHolder.tv = (TextView)view.findViewById(R.id.itemtext); viewHolder.bt = (Button)view.findViewById(R.id.itembutton); //绑定在一起 view.setTag(viewHolder); }else{ //如果有的话就直接取出 view = convertView; //经过了上一步,一个绘制过的View是肯定有一个ViewHolder的。 //复制的是地址,只是方便修改 viewHolder = (ViewHolder) view.getTag(); } viewHolder.ty.setText("xx‘); viewHolder.bt.setText("xx"); //或者其他代码 //会根据view以及它绑定的viewHolder来绘制Item return view; }
好了,这样优化过后,listView应该效率会很高了
时间: 2024-10-07 09:21:39