0

我有一个自定义 CursorAdapter,它在 bindView 中为 OnCheckedChangeListener 设置一个处理程序(newView 中的布局实现了 Checkable 接口)。'=>' 是 scala 中的匿名函数语法:

def setTaskCheckboxToggleListener() = {
  val v = view.findViewById(R.id.taskCheckbox).asInstanceOf[CheckBox]
  v.setOnCheckedChangeListener(
    (buttonView: CompoundButton, isChecked: Boolean) => {
      handler(buttonView, isChecked)
    }
  )
}

适配器与 listView 一起使用。现在处理程序在包含 listView 的活动中设置一次,使用:

listView.setAdapter(Tasks.adapter(context))
listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE);
listView.getAdapter().registerCheckBoxStateChangeHandler((buttonView: CompoundButton, _) => {
  findViewById(R.id.commandButton).astInstanceOf[Button].setText("✓")
}

由于某种原因,此处理程序会阻止切换复选框。相比之下,复选框仅适用于空处理程序或未在 UI 元素上调用 .setText 的处理程序。这里可能是什么问题?

Adapter中使用的Checkable布局,res/中的xml文件有一个CheckBox元素:

import android.content.Context
import android.util.AttributeSet
import android.view.View
import android.widget.{CheckBox, Checkable, CheckedTextView, RelativeLayout}

class TaskLayout(context: Context, attrs: AttributeSet)
  extends RelativeLayout(context, attrs) with Checkable {
  private var checkbox: CheckBox = _

    override def onFinishInflate(): Unit = {
      super.onFinishInflate();

      for (i <- 0 to getChildCount()) {
        val v = getChildAt(i)
        if (v.isInstanceOf[CheckBox])
          checkbox = v.asInstanceOf[CheckBox];
      }
    }

    override def isChecked(): Boolean = {
      if (checkbox != null)
        checkbox.isChecked()
      else
        false
    }

    override def setChecked(checked: Boolean) =
      if (checkbox != null) checkbox.setChecked(checked)

    override def toggle() =
      if (checkbox != null) checkbox.toggle();
}
4

1 回答 1

0

注释掉 listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE) 解决了这个问题。

于 2013-02-20T15:39:53.277 回答