AndroidのListView包含CheckBox时滑动丢失选中状态的解决

AndroidのListView包含CheckBox时滑动丢失选中状态的解决

listview 中,如果有10项,其中手机屏幕显示1-6项,其余的7-10项在屏幕中不可见,得向下滚动后才能看到,这个时候,如果选中1、2项,再滚动到7-10项,之后再滚动回来1-6项,就发现1、2项并未被选中。

解决方法: 编写自定义的Adapter,一下是代码部分。、

class ListviewAdapter extends BaseAdapter {
		private ArrayList<Appinfo> lists;
		private ViewHolder viewHolder;
		private HashMap<Integer, Boolean> map;

		public ListviewAdapter(ArrayList<Appinfo> list) {
			lists = list;
			map = new HashMap<Integer, Boolean>();
			for (int i = 0; i < lists.size(); i++) {
				map.put(i, false);
			}
		}

		@Override
		public int getCount() {
			return lists.size();
		}

		@Override
		public Object getItem(int arg0) {
			return null;
		}

		@Override
		public long getItemId(int arg0) {
			return 0;
		}

		@SuppressLint("NewApi")
		@Override
		public View getView(final int position, View convertView, ViewGroup arg2) {
			final Appinfo appUnit = lists.get(position);
			if (convertView == null) {
				viewHolder = new ViewHolder();
				convertView = LayoutInflater.from(SettingAppActivity.this)
						.inflate(R.layout.news_list_item, null);
				viewHolder.item_new = (TextView) convertView
						.findViewById(R.id.appName);
				viewHolder.item_pic = (ImageView) convertView
						.findViewById(R.id.icon);
				viewHolder.item_check = (CheckBox) convertView
						.findViewById(R.id.appcheck);
				convertView.setTag(viewHolder);
			} else {
				viewHolder = (ViewHolder) convertView.getTag();
			}
			viewHolder.item_new.setText(appUnit.getAppName());
			viewHolder.item_pic.setBackground(appUnit.getAppIcon());

			viewHolder.item_check
					.setOnCheckedChangeListener(new OnCheckedChangeListener() {

						@Override
						public void onCheckedChanged(CompoundButton arg0,
								boolean checked) {
							Toast.makeText(SettingAppActivity.this,
									"checked=" + checked, 1000).show();
							if (checked) {
								map.put(position, true);
							} else {
								map.put(position, false);
							}
						}
					});
			viewHolder.item_check.setChecked(map.get(position));
			return convertView;
		}
	}

	public class ViewHolder {
		public ImageView item_pic;
		public TextView item_new;
		public CheckBox item_check;
	}

正确的先存后取 之前错误的先取后存了

是因为index错误造成的,那么只要保证index值与当前positon保持一至即可,只要把添加监听器的方法加到初始化view中checkBox状态的代码之前即可.这样即始由于初始化造成调用了onCheckedChange()方法,也因为其中index值是最新的,不会错乱.



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值