Adapter是Listview与数据之间的桥梁,每当列表里有一项时,就要调用Adapter的getView()方法建立一个View。那么应对较少的数据时,这是彻底ok的,不会有什么问题,可是若是面对数据量很大的时候,对于每一条的建立view是很占用系统资源的,因此采用性能优化的方法。java
那么,了解了ListView的工做原理,咱们来看一下ListView的缓存机制。缓存
1)当数据量很大时,可见的项存放在内存中,其余的存放在Recycler中。性能优化
2)Listview经过getView()请求一个View,而后请求其余可见的View,这个时候,convertView在getView()时是空的。ide
3)当列表项中的第一项滚出屏幕,而且有数据从低端上来时,ListView 会再请求View,这时的convertView已经不在是空了,而是滚出屏幕的第一项,这时就不用建立View对象了,而要直接为其直接设定新值就能够了,这样就能够节省系统资源了。性能
自定义Adapter,使用缓存原理。优化
public class MyAdapter extends BaseAdapter{ private Context context; private String[] data; private int[] p_w_picpaths; public MyAdapter(Context context, String[] data,int[] p_w_picpaths){ this.context=context; this.data=data; this.p_w_picpaths=p_w_picpaths; } @Override public int getCount() { return data.length; } @Override public Object getItem(int position) { return data[position]; } @Override public long getItemId(int position) { return position; }
public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView==null){ convertView=LayoutInflater.from(context).inflate(R.layout.items, null); holder=new ViewHolder(); holder.iv=(ImageView) convertView.findViewById(R.id.adapter_iv); holder.tv=(TextView) convertView.findViewById(R.id.adapter_tv); convertView.setTag(holder); }else{ holder=(ViewHolder) convertView.getTag(); } holder.iv.setBackgroundResource(p_w_picpaths[position]); holder.tv.setText(data[position]); return convertView; } //存储一个View private static class ViewHolder{ ImageView iv; TextView tv; } }
在使用上是同样的,因为今天的主题不是它,这里就不介绍了。好了,就说这些,但愿会对你理解ListView的缓存机制有帮助。this