我需要一个具有三个状态(基本上是“忽略”,“包含”和“排除”)的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存储了一个布尔数组,它表示状态。该孩子可以是新创建的孩子,也可以是再生孩子。

我的想法是在我自己的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,在getView之后立即调用)是私有/默认访问修饰符。

如何使具有三种状态的选中文本视图在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>


您将如何解决该问题?

最佳答案

您将如何解决该问题?


没有什么可以阻止您在适配器级别“保留”阵列/列表中的行状态。对于您的ThreeStateTextView,您可以有一个ArrayListBoolean对象,其中nullBoolean.TRUEBoolean.FALSE代表您的三个状态。然后,需要通过查看先前的ThreeStateTextViewgetView设置为正确的状态(在适配器的ArrayList方法中)。当行中ArrayList的状态更改时,您还需要更新该ThreeStateTextView

10-05 21:15
查看更多