【问题标题】:Three state checked TextView in a ListViewListView 中的三个状态检查 TextView
【发布时间】:2013-01-03 13:07:24
【问题描述】:

我需要一个具有三种状态(基本上是“忽略”、“包含”和“排除”)的 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,在获取视图之后立即调用)是私有/默认访问修饰符。

我可以怎样做才能使我的三种状态的已检查文本视图在 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>

你会如何解决这个问题?

【问题讨论】:

    标签: android android-listview textview


    【解决方案1】:

    你会如何解决这个问题?

    没有什么能阻止您在适配器级别“保持”数组/列表中的行状态。对于您的ThreeStateTextView,您可以有一个ArrayListBoolean 对象,其中nullBoolean.TRUEBoolean.FALSE 代表您的三个状态。然后你需要通过查看前面的ArrayList,将ThreeStateTextView设置为正确(在适配器的getView方法中)状态。当某行中的 ThreeStateTextView 的状态发生变化时,您还需要更新该 ArrayList

    【讨论】:

    • 我知道,但这是要走的路吗?
    • @PaulS。是的,为什么不? ListView 保存这些检查状态不仅用于管理行的状态,还用于其他事情,如上下文操作栏。您的三个状态 TextView 不适合该场景,您将在适配器级别实现它。如果您真的想覆盖某些内容,那么您很可能需要扩展 AbsListView 并重新实现 ListView 的整个逻辑+您的修改。
    • 我现在做到了。但现在的问题是:当屏幕旋转时,状态没有保存。我需要将状态保存在我使用列表视图的片段/活动中。
    • @PaulS。状态未保存,您将自己保存并在轮换或其他配置更改后重新分配。 ListView 对其检查状态数组执行完全相同的操作,它将该数组保存在 onSaveInstanceState 中,并在稍后重新创建小部件时恢复它。
    • 这正是我的意思。只是看起来不太对。 ListView 应该处理这个问题,而不是每个(!)将 ListView 与我的 ThreeStateTextView 一起使用的活动或片段。 ListView 中的 setupChild 方法应该受到保护,恕我直言...
    猜你喜欢
    • 2015-02-27
    • 2015-02-14
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多