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的类型不正确,查找很久也没发现原因。
然后只能通过下面的设置,解决这个问题。
R.id.tag_key_chat_item_type和R.id.tag_key_chat_item_view是在ids.xml中定义的两个普通的id
@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
相关文章推荐
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- android ListView/Recyclerview滚动时自动调用onCheckedChanged导致CheckBox状态混乱的解决办法
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- android图文混排与多种类型listView的混搭的item的demo,getItemViewType()和getViewTypeCount()的使用
- android ListView显示多个类型item 和 item中控件抢夺焦点解决办法
- android ListView的Item中有CheckBox,导致OnItemClick不响应的解决办法
- ListView getItemViewType ArrayIndexOutOfBoundsException 的解决办法
- android ListView显示多个类型item 和 item中控件抢夺焦点解决办法
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- android ListView的Item中有CheckBox,导致OnItemClick不响应的解决办法
- android 自定义TextView支持微博功能后在ListView占用了Item点击的解决办法
- Android ListView的Item中有CheckBox,导致OnItemClick不响应的解决办法
- Android 继承BaseAdapter适配器中的getView方法,导致的ListView条目出现重复解决办法(转载)
- (转)Android ListView多种布局 getViewTypeCount和getItemViewType
- listview的重要属性viewtype,实现多类型item样式
- android listview + checkbox 列表上下滑动导致复选框状态丢失解决办法
- android中ListView点击和ListView的item里面的button或ImageView不能同时生效的解决
- 关于listview的item中如果有textview,listview点击item没有效果的解决办法
- Android开发中自定义ListView中存在ImageButton不响应ListItemClick单击事件详细d飞解决办法