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;
}