Android ListView解析

来源:互联网 发布:模拟登陆知乎 编辑:程序博客网 时间:2024/05/18 17:26

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
原创粉丝点击