【问题标题】:Android CheckBox - Removing a previously setOnCheckedChangeListenerAndroid CheckBox - 删除以前的 setOnCheckedChangeListener
【发布时间】:2011-12-18 01:27:46
【问题描述】:

我有一个使用我自定义的 CursorAdapter 显示 ListView 的应用程序。在我的自定义 CursorAdapter.bindView 中,我有一个 CheckBox 对象,我设置了选中的值(基于光标上的列)并设置了 clickListener。这是我的代码:

    CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.list_done);
    mCheckBox.setChecked(isDone);
    mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
    {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
        {
                AW.getDB().updateTask(c.getInt(c.getColumnIndex(ToDoDBAdapter.KEY_ID)), isChecked);
                TD.displayTasks();
        }
    });

唯一的问题是,当 Android 回收我的视图时,onCheckedChangeListener 仍然处于活动状态,因此对 setChecked() 的调用会导致侦听器中的代码运行。我想知道如何在我包含的代码运行之前使 onCheckedChangedListener 无效。

【问题讨论】:

    标签: android checkbox android-cursoradapter


    【解决方案1】:

    你可以调用mcheckBox.setOnCheckedChangeListener(null);,如果是在onCheckedChangeListener里面,你需要声明mCheckBoxfinal

    【讨论】:

      【解决方案2】:

      你可以这样做:

      // c is the Cursor you are getting
      CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.list_done);
      mCheckBox.setTag(new Integer(c.getPosition());
      mCheckBox.setChecked(isDone);
      mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener()
      {
          public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
          {
              Integer posInt = (Integer)buttonView.getTag();
      
              int pos = posInt.intValue();
              c.moveToPosition(pos);
                  AW.getDB().updateTask(c.getInt(c.getColumnIndex(ToDoDBAdapter.KEY_ID)), isChecked);
                  TD.displayTasks();
          }
      });
      

      您可以对上述代码进行很多优化。我只是说明了基本逻辑。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      相关资源
      最近更新 更多