bindView 内で OnCheckedChangeListener のハンドラーを設定するカスタム CursorAdapter があります (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 を含むアクティビティでハンドラーが 1 回設定されます。
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 を呼び出さないハンドラーでのみ機能します。ここで何が問題になる可能性がありますか?
アダプタで使用されるチェック可能なレイアウト。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();
}