ListView 缓存机制

    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

相关文章
相关标签/搜索