首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ListView中检查三种状态的TextView

在ListView中检查三种状态的TextView
EN

Stack Overflow用户
提问于 2013-01-03 21:07:24
回答 1查看 795关注 0票数 1

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

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

代码语言:javascript
复制
... setupChild(...) {
...
if (mChoiceMode != CHOICE_MODE_NONE && mCheckStates != null) {
    if (child instanceof Checkable) {
        ((Checkable) child).setChecked(mCheckStates.get(position));
    }
}
....

所以看起来,ListView存储了一个布尔值数组,它表示状态。子项可以是新创建的子项,也可以是回收的子项。

我的想法是在我自己的listview实现中重新实现这个方法,但是这个方法是私有的,所以我不能这么做。下面是堆栈跟踪,从BaseAdapter.getView(...)开始:

代码语言:javascript
复制
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不保存复选框的状态。

以下是示例布局:

代码语言:javascript
复制
<?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>

你将如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-04 00:46:48

你将如何解决这个问题?

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14139557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档