Android ListView解析

ListView是我们的Android项目中常用的组件,以垂直列表的形式显示列表项。

 一、Adapter

说到ListView就不得不说Adapter,ListView不会直接与数据源打交道,Adapter是ListView和数据源之间的桥梁 。我们常通过extends BaseAdapter实现自己的Adapter。

public class MyAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        // How many items are in the data set represented by this Adapter.
        return 0;
    }

    @Override
    public Object getItem(int position) {
        // Get the data item associated with the specified position in the data set.
        return null;
    }

    @Override
    public long getItemId(int position) {
        // Get the row id associated with the specified position in the list.
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get a View that displays the data at the specified position in the data set.
        return null;
    }
}

二、ListView

工作原理

ListView初始化加载数据的时候会调用adapter的getCount()方法得到item的数量,通过adapter的getView得到position的View,但是并不会将所有的position都通过getView()得到View,而是仅仅为当前手机屏幕上所能显示的position去getView()。

 缓存机制

随着手指的移动,移出屏幕的position的View会被加入到RecyleBIn中进行缓存,而有新的position需要显示时,会从缓存中获取View。

 ListView性能优化

在BaseAdapter的getView()方法中有个参数叫convertVIew,它就是listView在RecycleBin的缓存的View,目的就是为了避免不停地Inflate layout,实现对View的重用。如下图:

 public View getView(int position, View convertView, ViewGroup parent) {
        if(convertView == null)
        {
            convertView = layoutInflater.inflate(R.layout.list_item, null);
        }
        TextView textView = convertView.findViewById(R.id.projectName);
        textView.setText(list.get(position));
        return convertView;
    }

但是这样每次还要为布局里的子控件去findViewById, 为了进一步优化ListView,我们可以使用VIewHolder将每一个convertView绑定起来,这样的话就可以避免每次使用convertView都要去为子控件findViewById一次。

public View getView(int position, View convertView, ViewGroup parent) {
         ViewHolder viewHolder;
        if(convertView == null){
            viewHolder = new ViewHolder();
            convertView = layoutInflater.inflate(R.layout.list_item,,null);
            viewHolder.textView = (TextView) convertView.findViewById(R.id.projectName);
            convertView.setTag(viewHolder);
        }
        else{
           viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.textView.setText(list.get(position));
        return convertView;
    }
    class ViewHolder{
        public TextView textView;
    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值