您的位置:首页 > 移动开发 > Android开发

Android ListView 多个ItemViewType 导致View类型混乱的解决办法

2014-04-11 14:11 495 查看
关于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐