2013-01-03 48 views
1

我需要一個具有三種狀態(基本上「忽略」,「包含」和「排除」)的CheckedTextView,因此我構建了自己的視圖並且它可以工作。但是我想將我的ThreeStateTextView嵌入到ListView中,這不起作用。三個狀態檢查ListView中的TextView

ListView回收視圖和狀態丟失。所以,我看着ListView控件代碼,看看它是如何從CheckedTextView處理狀態:

... setupChild(...) { 
... 
if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) { 
    if (child instanceof Checkable) { 
     ((Checkable) child).setChecked(mCheckStates.get(position)); 
    } 
} 
.... 

因此,看起來,這ListView的存儲布爾值的數組,它代表了狀態。孩子要麼是一個新創造的孩子,要麼就是一個回收的孩子。

我的想法是在我自己的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和setupChild,這是obtainView後立即調用)都是民營/默認訪問修飾符。

我能做些什麼來使三個狀態的檢查文本視圖在ListView中工作?

//編輯: 也許我應該改一下我的問題: 你有一個ListView和自己的BaseAdapter實現,但你的適配器創建複雜的觀點或使用convertView參數(例如,它有一個TextView和兩個創建一個線性佈局複選框)。問題是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> 

你會如何解決這個問題?

回答

2

你會如何解決這個問題?

沒有什麼能夠阻止您在適配器級別「保持」陣列/列表中的行狀態。對於你的ThreeStateTextView你可以有ArrayListBoolean對象null,Boolean.TRUEBoolean.FALSE代表你的三個狀態。然後,您需要通過查看以前的ArrayList,將ThreeStateTextView設置爲正確的(在適配器的getView方法中)狀態。當一行中ThreeStateTextView的狀態發生更改時,您還需要更新ArrayList

+0

我知道了,但那是走的路嗎? –

+0

@PaulS。是的,爲什麼不? 'ListView'保存那些選中的狀態,不僅用於管理行的狀態,還用於其他事情,如上下文操作欄。您的三個狀態'TextView'不適合這種情況,您將在適配器級別實現它。如果你真的想重寫某些東西,那麼你很可能需要擴展'AbsListView'並重新實現'ListView'的整個邏輯+你的修改。 – Luksprog

+0

我現在做了。但現在的問題是:當屏幕旋轉時,狀態不會被保存。我需要保存片段/活動中的狀態,我使用listview。 –