2013-01-03 67 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。 –