【问题标题】:Checkboxes in a ListView - When I select the first, it checks the last and vice versaListView 中的复选框 - 当我选择第一个时,它会检查最后一个,反之亦然
【发布时间】:2012-01-20 15:18:36
【问题描述】:

我已经设置了一个 ListView,它在每一行中都包含一个 Checkbox(以及一个 TextView)。出于某种原因,当我“检查”其中一个框时,它似乎“检查”列表视图中的框相对的(即选择顶框时,选择底部复选框,而顶部保持未选中。

我意识到这里没有任何代码可以使用,但我只是想知道这是否是一个普遍问题?如果没有,我可以尝试发布一些代码。谢谢!

【问题讨论】:

  • 发布 ListView 适配器和资源 xml 的代码
  • 您可能应该发布一些代码,但确实存在一个常见的普遍问题(不是错误,而是很多 Android 新手没有意识到的设计问题),这可能就是您的问题'正在与 Android ListViews 重用 Views 的方式有关,以防止过多的对象创建和垃圾收集。
  • 我的目标是创建一个菜单,当用户选择一个或多个复选框时(就像在 gmail 上一样)。我不确定如何决定要发布哪些代码部分,但是当我取出在底部显示“菜单”的方法时,问题就消失了。关于如何实现垃圾回收的任何想法?

标签: android android-listview


【解决方案1】:

视图在 ListView 中被回收。这就是为什么有些人在你认为不应该检查的时候被检查。

重点是:复选框不知道它代表适配器中的哪个项目。它只是 ListView 中一行中的一个复选框。您需要做一些事情来“教”当前正在显示数据集中哪些项目的行。因此,不要使用像字符串数组这样简单的东西作为适配器的数据,而是创建一个新的模型对象,将复选框的状态存储在其中。然后,在您返回 getView() 中的行之前,您可以执行以下操作:

//somewhere in your class
private RowData getData(int position) {
return(((MyAdapter)getListAdapter()).getItem(position)); 
}



 //..then in your adapter in getView()

    RowData object = getModel(position);

     if(object.isChecked()) {
       myCheckbox.setChecked(true);
     } else {
       myCheckbox.setChecked(false);
      }

     //then retun your view.

【讨论】:

  • 感谢您的回复。我的 ListAdapter 在一个完全不同的类中的 fillData() 方法中。有错吗?
  • @jstaff107,不,您可以随心所欲地使用适配器。
  • 我不太确定“RowData”类的来源?
  • @jstaff107,您必须创建该类。只是一个普通的旧 java 对象类。这只是一个示例名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-01
  • 2021-11-11
  • 2014-04-05
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
相关资源
最近更新 更多