【问题标题】:OnCheckedChangeListener fires when scrolling down向下滚动时触发 OnCheckedChangeListener
【发布时间】:2015-03-30 18:41:37
【问题描述】:

我遇到了一个奇怪的问题。我有一个 android 应用程序,它包含包含ListViewAdapter 的活动。每个元素都包含一个checkbox。 我有以下代码-

public View getView(final int position, View convertView, ViewGroup parent) {

    CheckBox check = (CheckBox) view.findViewById(R.id.myCheckBox);
    if(check.getTag() == null) {
        check.setTag(position);
        check.setOnCheckedChangeListener(myCheckChangList);
    }
   check.setChecked(holders.get(position).isChecked);              
}

private OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  
          holders.get((Integer) buttonView.getTag()).isChecked = isChecked;
      }
};  

当我向下滚动我的listview 时,我的OnCheckedChangeListener 会触发并重置我的checkbox(如果已设置)。为什么会这样?当我手动单击 checkbox 或以编程方式调用 setChecked 时会触发 OnCheckedChangeListener,但当我向下滚动时也会触发。为什么?

【问题讨论】:

  • 可能是您的适配器中正在进行视图回收,但您发布的代码不能是您的实际代码。
  • 发布实际代码。

标签: java android listview checkbox


【解决方案1】:

当你滚动 getView 时,由于适配器的视图回收行为而调用方法。和setChecked 方法将调用触发OnCheckedChangeListener。

【讨论】:

  • 很抱歉,我不明白为什么在滚动时应该调用 setChecked 方法?我只是滚动,但我没有选中或取消选中复选框。
  • 对于您需要了解适配器机制:通过此链接:piwai.info/android-adapter-good-practices
  • 谢谢你,这是一篇好文章,但我还没有找到我的问题的答案 - 为什么在滚动时应该调用 setChecked 方法?
  • 如果您正确检查该文章,它表明每次滚动列表时都会调用 getView 以添加新行和删除旧行。以便您每次调用 setChecked 方法
【解决方案2】:

Karn 是正确的,它正在被回收,所以在滚动时,它会生成视图并且:

check.setChecked(holders.get(position).isChecked); 

这样做是因为每次滚动时都会调用您的侦听器,因为您将侦听器设置为在检查更改时进行侦听。将您的 setOnCheckedChangeListener 更改为 setOnClickListener。

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多