1

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>

その問題をどのように解決しますか?

4

1 に答える 1

2

その問題をどのように解決しますか?

アダプターレベルで配列/リスト内の行の状態を「保持」することを妨げるものは何もありません。あなたのために、あなたはあなたの3つの状態を表す、とのオブジェクトをThreeStateTextView持つことができます。次に、前のを見て、を正しい(アダプタの方法で)状態に設定する必要があります。また、行からのの状態が変化したときにそれを更新する必要があります。ArrayListBooleannullBoolean.TRUEBoolean.FALSEThreeStateTextViewgetViewArrayListArrayListThreeStateTextView

于 2013-01-03T16:46:47.837 に答える