3 つの状態 (基本的に「無視」、「含める」、「除外」) を持つ CheckedTextView が必要だったので、独自のビューを作成すると機能します。しかし、ThreeStateTextView を ListView に埋め込みたいのですが、うまくいきません。
ListView はビューをリサイクルし、状態は失われます。そこで、ListView コードを調べて、CheckedTextView からの状態をどのように処理するかを確認しました。
... setupChild(...) {
...
if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
if (child instanceof Checkable) {
((Checkable) child).setChecked(mCheckStates.get(position));
}
}
....
したがって、ListView には、状態を表すブール値の配列が格納されているように見えます。子は、新しく作成された子またはリサイクルされた子のいずれかです。
私のアイデアは、このメソッドを独自のリストビュー実装で再実装することでしたが、このメソッドはプライベートであるため、それを行うことはできません。BaseAdapter.getView(...) から始まるスタック トレースは次のとおりです。
xxxxxxAdapter.getView(int, View, ViewGroup) line: 50 (my own BaseAdapter implementation)
ListView(AbsListView).obtainView(int, boolean[]) line: 2159
ListView.makeAndAddView(int, int, boolean, int, boolean) line: 1831
ListView.fillDown(int, int) line: 674
ListView.fillFromTop(int) line: 735
ListView.layoutChildren() line: 1652
ListView(AbsListView).onLayout(boolean, int, int, int, int) line: 1994
ListView(View).layout(int, int, int, int) line: 14003
ListView(ViewGroup).layout(int, int, int, int) line: 4375
残念なことに、重要なメソッド (obtainView と、obtainView の直後に呼び出される setupChild) は、private / default アクセス修飾子です。
ListView で 3 つの状態を持つチェック済みテキストビューを機能させるにはどうすればよいですか?
// 編集: おそらく私の質問を言い換える必要があります: ListView と独自の BaseAdapter 実装がありますが、アダプターは複雑なビューを作成するか、convertView パラメーターを使用します (たとえば、TextView と 2 つのチェックボックスを使用して線形レイアウトを作成します)。問題は、ListView がチェックボックスの状態を保存しないことです。
レイアウトの例を次に示します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView android:id="@+id/textview_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<CheckBox android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
その問題をどのように解決しますか?