关于ListView的基本使用,应该都很清楚。无非就是用一个ViewHolder缓存,然后重用convertView。如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
return convertView;
}
class ViewHolder {
ImageView imageView;
}
但是这次在做一个即时通讯的项目是,ListView中要放的ItemViewType 有十几个之多。然后,同样的使用上面的缓存方法,如下:
private class ChatHeadAdapter extends BaseAdapter {
@Override
public int getCount() {
return 50;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position % 2;// Type 两种 0和1
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
LeftViewHolder leftViewHolder = null;
RightViewHolder rightViewHolder = null;
if (convertView == null) {
if (viewType == 0) {// left
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
leftViewHolder = new LeftViewHolder();
leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
convertView.setTag(leftViewHolder);
} else {
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null);
rightViewHolder = new RightViewHolder();
rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
convertView.setTag(rightViewHolder);
}
} else {
if (viewType == 0) {// left
leftViewHolder = (LeftViewHolder) convertView.getTag();
} else {
rightViewHolder = (RightViewHolder) convertView.getTag();
}
}
if (viewType == 0) {// left
leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left);
} else {
rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right);
}
return convertView;
}
class LeftViewHolder {
ImageView leftImageView;
}
class RightViewHolder {
ImageView rightImageView;
}
}
当然实际情况比上面的要复杂的多,上面只是一个简单的例子。
不知道是由于什么原因,用了类似上面的方法来处理我的十几个ItemViewType,还是会经常出现ViewItem的类型不正确,查找很久也没发现原因。
然后只能通过下面的设置,解决这个问题。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
LeftViewHolder leftViewHolder = null;
RightViewHolder rightViewHolder = null;
if (convertView == null||((Integer) convertView.getTag(R.id.tag_key_chat_item_type))!=viewType) {
if (viewType == 0) {// left
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_left_item_text, null);
leftViewHolder = new LeftViewHolder();
leftViewHolder.leftImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
convertView.setTag(R.id.tag_key_chat_item_view,leftViewHolder);
} else {
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.chat_right_item_text, null);
rightViewHolder = new RightViewHolder();
rightViewHolder.rightImageView = (ImageView) convertView.findViewById(R.id.chat_head_iv);
convertView.setTag(R.id.tag_key_chat_item_view,rightViewHolder);
}
convertView.setTag(R.id.tag_key_chat_item_type, viewType);
} else {
if (viewType == 0) {// left
leftViewHolder = (LeftViewHolder) convertView.getTag(R.id.tag_key_chat_item_view);
} else {
rightViewHolder = (RightViewHolder) convertView.getTag(R.id.tag_key_chat_item_view);
}
}
if (viewType == 0) {// left
leftViewHolder.leftImageView.setImageResource(R.drawable.head_temp_left);
} else {
rightViewHolder.rightImageView.setImageResource(R.drawable.head_temp_right);
}
return convertView;
}
R.id.tag_key_chat_item_type和R.id.tag_key_chat_item_view是在ids.xml中定义的两个普通的id