listView使用及优化的浅显理解
先来说下我对listview简单的理解
代码一般由三部分成:
- 子项布局文件
- 重写的适配器类
- 数据类(存放要在listview中显示的数据)
- 再就是在活动中写的listview部分的代码
先说一下listview要做的事
listview只是提供了显示的功能,其他所有的东西基本都是直接交给adapter去实现的,因为listview并不能事先知道你数据的类型和布局的类型,如果这些东西都交给listview去实现的话,代码明显会变得非常繁琐,listview做的事只是将他需要的适配器拿到就OK了
看一下adapter做的事
public class MyAdapter extends ArrayAdapter<things> {
private int ResourceID;
public MyAdapter(Context context, int ResourceID, List<things> thingsList){
super(context,ResourceID,thingsList);
this.ResourceID = ResourceID;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
things things = getItem(position);
View view;
ViewHolder viewHolder;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(ResourceID,parent,false);
viewHolder = new ViewHolder();
viewHolder.s = view.findViewById(R.id.wenzixianshi);
view.setTag(viewHolder);
}else {
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.s.setText(things.getS());
return view;
}
class ViewHolder{
TextView s;
}
}
adapter做的事就是将一个个子项view创建并显示,
- 刚开始adapter会去创建一个集合,然后创建一个子项view之后(计算他所占的屏幕大小)并将之加到集合中
- 当检查到屏幕没有多余空间的时候,就停止创建view,然后将之显示在listview中(这里的顺序不是特别清楚)
- 当程序检测到listview滑动的时候,会通过参数position来确定此时接下来需要显示的view需要填充哪一个数据项
- 此时会有一个view被滑出屏幕空间,就会被添加到一个叫做view回收的集合中
- 此时在convertView返回的参数就不是空了,他所带的内容是view回收集合中的应经被回收的view,此时就不需要重新传建新的view实例了,会大大的省略时间
- 这里我用了一个内部类去保存每个view的数据,以便下次就不需要用findviewByID()去寻找控件了,将这个内部类绑定到view上面
- 这样的话就是每个view都会带一个数据类,然后当快速滑动的时候,每次都只是通过参数position拿到当前数据项,给view的ViewHolder赋值,相对来说会快捷很多吧
这里还是上图弥补一下我的语文水平吧