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

关于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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值