在我们开发的过程中,经常会用到列表listview跟gridview, GridView跟ListView都是比较常用的多控件布局,有时候我们需要操作列表中的控件或数据,最好的办法就是使用自定义适配器来实现这些需求。这篇文章主要讲解自定义的基本操作知识。
首先来看看 列表视图、初始数据、列表项布局关系图
上图可以理解为基础数据Arraylist设置给列表项布局book_item.xml,然后通过position将item视图添加到ListView中。
下面看看如何自定义适配器:
自定义适配器的适配器代码集成BaseAdapter
private class BookAdapter extends BaseAdapter{
//取得初始数据的长度
@Override
public int getCount() {
// TODO Auto-generated method stub
return data==null?0:data.size();
}
//通过position取得数据Item项
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data==null?null:data.get(position);
}
//通过position得到item项的行号
@Override
public long getItemId(int position) {
return data==null?0:Long.valueOf(data.get(position).get(ID).toString());
}
/**返回当前要显示的item视图
* position: 当前要显示的item项的数据的位置(data的位置)
* convertView:可回收的item项视图对象
* parent:父控件
*/
public View getView(int position, View convertView, ViewGroup parent) {
//取得当前要显示的数据
HashMap<String, Object> map=data.get(position);
//先判断convertView是否为空
if(convertView==null){
convertView=getLayoutInflater().inflate(R.layout.book_item, parent, false);
}
TextView nameEdt=(TextView) convertView.findViewById(R.id.name);
TextView priceEdt=(TextView) convertView.findViewById(R.id.price);
//设置item项的控件的数据
nameEdt.setText(map.get(NAME).toString());
priceEdt.setText(map.get(PRICE).toString());
//设置item项的控件的属性
nameEdt.setTextColor(Color.RED);
priceEdt.setTextColor(Color.BLUE);
return convertView;
}
}
由于自定义适配器在加载item的过程中,会不断的创建列表视图,因此当某个item进入视野范围内时,就会调用adapter的getView方法,重新渲染item。之前我们在每次渲染item的时候都重新实例化item的布局文件,创建一个View,这样会产生很多的对象,性能不佳。
.我们尝试使用下面这种循环利用的方案
1> 假设我们的屏幕刚好只能放下3个item
2> 当从状态1—>状态2,有4个item同时出现在屏幕中,因此这4个ItemView都是不同的对象
3> 当从状态2—>状态3,item-0消失在视野中
4> 当从状态3—>状态4,我们可以考虑把之前的item-0移动到item-4的位置,因为item-0跟item-4不会同时出现在我们视野范围中
5> 当从状态4—>状态3,我们可以考虑把之前的item-4移动到item-0的位置
3. 再来看public View getView(int position, View convertView, ViewGroup parent)中的convertView参数,这个是系统帮我们传递进来的,它就代表当前可循环利用的ItemView
4. 注意:虽然性能有提升,但是在渲染item的时候,一定保证当前item要完全覆盖可循环利用item的数据,因为循环利用item可能会造成旧数据残留。