在使用ListView实现包含不同类型ItemView的列表时,最常见的就是聊天界面,它包括发送方和接收方两种类型的Item视图。
上图就包括两种类型的视图。
实现的具体骤就是继承BaseAdapter,重载getCount()、getItem()、getItemId()、getView()这四个存在于Adapter接口中的方法。
其中最关键的就是View getView(int position, View convertView, ViewGroup parent);
要实现不同类型的视图,就是在这里进行处理。
ViewHolder是常用的优化方法
public View getView(int position, View convertView, ViewGroup parent) {
// ...
if (convertView == null) {
holder = new ViewHolder();
convertView = createViewByType(msg, position);
// 初始化布局,converView.findViewById(...)
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
这时,当存在多种类型的View时,要注意
private static final int TYPE_COUNT = 2; // View Type count
private static final int TYPE_SEND_TXT = 0;
private static final int TYPE_RECEIVE_TXT = 1;
@Override
public int getItemViewType(int position) {
...
}
@Override
public int getViewTypeCount() {
return TYPE_COUNT;
}
复写getItemViewType()方法的同时,千万别忘了也要复写getViewTypeCount()。
该方法默认返回1,即只有一种类型的View。
此时在调用getView的时候,可能会传入错误类型的convertView(ListView的复用机制),从而产生错误。
另外:在定义类型时,要按顺序从0开始编号,否则在获得View类型时会产生数组越界。
详见https://blog.csdn.net/lingfeng2a/article/details/51123592