【问题标题】:When i uncheck Checkbox Next Checkbox get Selected after Scrolling ListView当我取消选中复选框时,下一个复选框在滚动列表视图后被选中
【发布时间】:2016-01-19 00:23:20
【问题描述】:

请帮助我尝试在 ListView 中进行多个复选框选择。 我也尝试过/参考LinkLink 但现在我收到新错误,当我取消选中复选框时,下一个复选框在滚动列表视图后被选中。我不知道我的代码有什么问题,请帮助我。

//Main ListView Class


	public View getViewByPosition(int position, ListView listView) {
		final int firstListItemPosition = closeMListView
				.getFirstVisiblePosition();
		final int lastListItemPosition = firstListItemPosition
				+ closeMListView.getChildCount() - 1;

		if (position < firstListItemPosition || position > lastListItemPosition) {
			return closeMListView.getAdapter().getView(position, null,
					closeMListView);
		} else {
			final int childIndex = position - firstListItemPosition;
			return closeMListView.getChildAt(childIndex);
		}
	}

	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		// TODO Auto-generated method stub
		System.out.println("Inside onItemClick  position     " + position);
		System.out.println("Inside onItemClick  ckStatus     " + ckStatus.size());
		View vi = getViewByPosition(position, closeMListView);
		cb = (CheckBox) vi.findViewById(R.id.ckHStatus);
		// cb.setOnCheckedChangeListener(null);
		// cb.setOnCheckedChangeListener(this);

		System.out.println("Inside onItemClick  ckStatus     "
				+ (ckStatus.get(position) == true));
		if (ckStatus.get(position) == true) {
			ckStatus.add(position, false);
			cb.setChecked(false);
			ListViewAdapterForCloseM.mIds
					.remove(ListViewAdapterForCloseM.mId.get(position));
		} else {
			cb.setChecked(true);
			ckStatus.add(position, true);
			ListViewAdapterForCloseM.mIds
					.add(ListViewAdapterForCloseM.mId.get(position));
		}
	}

我的适配器类是

public class ListViewAdapterForCloseM extends BaseAdapter {
	Context mContext;
	MyAppDB helper;
	public static ArrayList<String> mId;
	ArrayList<String> vName, vMDate, mStatus;
	public static ArrayList<String> mIds;
	LayoutInflater inflater;
	ViewHolder holder;
	Cursor cr;
	View vi;
	int myPosition;

	public ListViewAdapterForCloseM(Context context,
			int listviewItemClosemeeting,
			List<HashMap<String, String>> arrayList) {
		// TODO Auto-generated constructor stub
		System.out.println("Inside ListView AD  arrayList     "
				+ arrayList.size());

		mContext = context;
		helper = new MyAppDB(mContext, MyAppDB.DB_NAME, null, 1);
		mId = new ArrayList<String>();
		vName = new ArrayList<String>();
		vMDate = new ArrayList<String>();
		mStatus = new ArrayList<String>();
		mIds = new ArrayList<String>();

		for (int i = 0; i < arrayList.size(); i++) {
			HashMap<String, String> content = new HashMap<String, String>();
			content = arrayList.get(i);
			mId.add(content.get("Id"));
			vName.add(content.get("vName"));
			vMDate.add(content.get("Date"));
			mStatus.add(content.get("status"));
		}
	}

	class ViewHolder {
		TextView tvVName, tvMDate, tvMStatus;
		CheckBox cb;
	}

	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return mId.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		vi = convertView;
		holder = null;
		myPosition = position;

		System.out.println("Inside getView " + position);
		if (vi == null) {
			vi = LayoutInflater.from(mContext).inflate(
					R.layout.listview_adapter_item, null);
			holder = new ViewHolder();
			holder.tvVName = (TextView) vi.findViewById(R.id.tvLvVName);
			holder.tvMDate = (TextView) vi.findViewById(R.id.tvLvDate);
			holder.tvMStatus = (TextView) vi.findViewById(R.id.tvLvStatus);
			holder.cb = (CheckBox) vi.findViewById(R.id.ckHStatus);
			vi.setTag(R.id.ckHStatus, holder.cb);
			vi.setTag(holder);
		} else {
			holder = (ViewHolder) vi.getTag();
		}

		System.out.println("Inside getView status     "
				+ CloseM.ckStatus.get(position));
		holder.tvVName.setText(vName.get(position));
		holder.tvMDate.setText(vMDate.get(position));
		holder.tvMStatus.setText(mStatus.get(position));
		holder.cb.setChecked(CloseM.ckStatus.get(position));
		// holder.cb.setTag(holder);
		return vi;
	}
}

【问题讨论】:

  • 代码 sn-p 功能适用于 html / css / javascript。
  • @GottZ 我不知道stackoverflow整体请检查代码并尝试理解。

标签: android listview checkbox


【解决方案1】:

删除代码

holder.cb.setChecked(CloseM.ckStatus.get(position));

在适配器类的 getView 中,当您滚动列表视图时,adatper 类的 getView 方法将被调用,因此复选框被选中。

您可以根据需要在 LIstItem 或其他地方选择您的复选框。

【讨论】:

  • 当我这样做并选择任何复选框,如第 0 位第 4、第 8、第 12 位...复选框被自动选中。 @venkatesh
  • 在 LIstView onItemClick 内部,当我检查所有项目状态为“假”但复选框被选中时,我怎么可能不明白?
  • 那么问题可能是您用于设置复选框的 if 条件为真,请检查“ckStatus.get(position)”返回什么......!
  • 实际上,我从不检查 CheckBox 内部的状态,如果我创建了 ArrayList,它充满了 false 和相同大小的 listview,你知道 onItemClick()。 (ckStatus.get(position) == true) ArrayList 在位置值。
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
相关资源
最近更新 更多