Adapter的优化
在这里我主要讲自定义adapter的优化:
- viewHolder类, 实现控件的复用
- 将点击事件都传出去,交给实现这个adapter的类处理
- 定义一个传递数据的方法
- layoutInflater的实例化
ViewHolder类
- 先将布局文件中所有的view 声明
在adapter的getView方法里这样写:
ViewHolder vh = null; if (convertView == null) { vh = new ViewHolder(); convertView = layoutInflater.inflate( R.layout.layput_customer_item, null); vh.nameText = (TextView) convertView .findViewById(R.id.tv_user_name); vh.nameText.setTag(position); ` convertView.setTag(vh); } else { vh = (ViewHolder) convertView.getTag(); }
定义新的接口
尽量不在adapter里做数据处理,因为adapter主要负责展示数据。而且adapter的数据是来源于调用他的类。比较好的处理方式是将要点击之后的操作扔出去。
具体的写法
adapter 定义列表接口:
public interface SetOnClickListener{
void onNameClick(int position);
}
// 声明
private SetOnClickListener l;
// 外部要实现这个接口时需要赋值
public void setListener(SetOnClickListener l) {
this.l = l;
}
// adapter内部 某一个控件点击事件处理交给定义的接口
vh.nameText.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
int pos = (int) v.getTag();
if(l != null){
l.onNameClick(pos);
}
}
});
// 外部调用adapter时可以像下面这么写
ContactAdapter contactAdapter = new ContactAdapter(contacts, getActivity());
**contactAdapter.setListener(CustomerFragment.this);**
contactListView.setAdapter(contactAdapter)
layoutInflater的实例化
layoutlnflater的实例化,以前我的习惯就直接放在getView方法里,实际上那样会每次都会生成新的对象。 getView()方法是每次都会绘制子view执行的,所以要尽可能的减少代码的执行。我们可以把实例化的代码放在adapter 的构造方法里。下面的这个代码块其实还可以细分,那就是把数据集合拿出来,专门定义一个方法去传递数据。
public ContactAdapter(List<Contact> aNameList,Context context) {
contactListData = aNameList;
this.context = context;
**layoutInflater = LayoutInflater.from(context);**
}