三个状态在ListView中检查了TextView

时间:2013-01-03 13:07:24

标签: android android-listview textview

我需要一个带有三种状态的CheckedTextView(基本上是“忽略”,“包含”和“排除”),所以我构建了自己的视图并且它有效。但我想在ListView中嵌入我的ThreeStateTextView,这不起作用。

ListView回收视图,状态丢失。所以我查看了ListView代码,看看它如何处理来自CheckedTextView的状态:

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

看起来,ListView存储一个布尔数组,代表状态。孩子要么是新生儿,要么是再生孩子。

我的想法是在我自己的listview实现中重新实现这个方法,但是这个方法是私有的,所以我不能这样做。这是stacktrace,从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   

太糟糕了,重要的方法(在winsView之后调用的obtainView和setupChild)是私有/默认访问修饰符。

如何使我在三个状态下检查的textview在ListView中工作?

//编辑: 也许我应该改述我的问题: 您有一个ListView和您自己的BaseAdapter实现,但您的适配器创建复杂视图或使用convertView参数(例如,它创建一个带有TextView和两个Checkbox的线性布局)。问题是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>

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

  

你会如何解决这个问题?

没有什么可以阻止您在适配器级别“保持”数组/列表中的行状态。对于ThreeStateTextView,您可以拥有ArrayList Booleannull个对象,Boolean.TRUEBoolean.FALSEThreeStateTextView代表您的三个州。然后,您需要通过查看之前的getViewArrayList设置为正确的(在适配器的ArrayList方法中)状态。当一行ThreeStateTextView的状态发生变化时,您还需要更新{{1}}。