当前位置: 首页 > 知识库问答 >
问题:

Listview和行选择器不工作

益炜
2023-03-14

我对此感到困惑。我搜索了2个多小时,无法理解发生了什么。

我有一个列表视图,我希望项目(行)是可选的。为了实现这一点,我设置了一个选择器作为行布局的背景。

ListView在片段中是这样定义的。xml布局文件:

    <ListView
        android:id="@+id/lst_friends"
        android:layout_width="match_parent"
        android:dividerHeight="1dp"
        android:divider="#ff0000"
        android:layout_height="0dp"
        android:layout_weight="1.0" />

选择器(bg_row_contact.xml)如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@android:color/white" android:state_selected="false"/>
    <item android:drawable="@color/pink" android:state_selected="true"/>

</selector>

我的行布局(row_contact.xml)如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/bg_row_contact"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="7dp"
        android:gravity="center" >
        <ImageView
            android:id="@+id/img_lst"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:contentDescription="@string/contentDescription_pic" />
    </LinearLayout>

    <TextView
        android:id="@+id/txt_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginRight="20dp"
        android:layout_marginLeft="10dp"
        android:ellipsize="end"
        android:maxLines="2"
        android:textColor="#000000"
        android:textSize="16sp" />

</LinearLayout>

现在,我有一个自定义适配器,在其中我这样做是为了在用户单击该行时将项目标记为选中,这是完美的:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // View from recycle
        View row = convertView;

        // Handle inflation and make sure not to re-use a header view
        if (row == null) {
            LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = inflater.inflate(R.layout.row_contact, null);
            row.setTag(position);

            row.setOnClickListener(new OnClickListener() {                  
                @Override
                public void onClick(View v) {
                    v.setSelected(!v.isSelected());
                }
            });
        }

        boolean condition = (position==3);

        row.setSelected(condition);
    }

我现在的问题是,在滚动listview时,我显然希望保持选择状态。所以我有一个条件,我根据这个条件检查并设置行为selected或not,正如您在

row.setSelected(boolean condition);

问题是,尽管某些行的条件为真,但行的背景选择器不工作,行也没有突出显示。

我什么都试过了,但找不到哔哔声是怎么回事。

有什么建议吗?

共有1个答案

鲍钊
2023-03-14

我玩了一会儿,我想我找到了解决你问题的办法。这一个适用于列表。setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)

您可以通过列表获取所选项目。GetCheckEditePositions()。唯一奇怪的是,在选择器中,你必须使用android:state\u activated而不是android:state\u checked

活动代码:

    ListView list = (ListView) findViewById(R.id.listView);

    // dummy values
    final String[] values = new String[] { "a", "b", "c", "d", "e", "f", "g",
            "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
            "t", "u", "w", "x", "y", "z" };
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.row_contact, values){

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // View from recycle
            View row = convertView;

            // Handle inflation and make sure not to re-use a header view
            if (row == null) {
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                row = inflater.inflate(R.layout.row_contact, null);
                row.setTag(position);

            }
            ((TextView)row.findViewById(R.id.txt_title)).setText(values[position]);
            return row;
        }

    };
    list.setAdapter(adapter);
    list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

选择器(bg_row_contact.xml)

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@android:color/white" android:state_activated="false"/>
    <item android:drawable="@android:color/black" android:state_activated="true"/>

</selector>

希望这有帮助。

 类似资料:
  • 我试图在表中使用日期选取器添加和删除行。默认情况下,日期选取器不起作用。但是我点击了添加行按钮,它已经工作了。我找不到解决方案。 请参考小提琴位置。

  • 我正在写一段代码来登录Gmail。在密码页面上,我不是使用隐式等待,而是想改用显式等待。然而,它不是拿起我的选择器? 我得到了一个错误: (节点:14428)UnhandledPromiseRejectionWarning:错误:processTicksAndRejections(internal/process/next_tick.js:81:5)处的elementHandle._clickab

  • 我正在使用PrimeFaces 5.1,在我的项目dataTable中过滤使用。在文本过滤器中工作正常,但下拉过滤器工作不正常(即)在下拉列表中我显示部门,第一次我从下拉列表中选择任何值都是工作正常,另一次我选择下拉列表它不返回dataTable中显示的任何值。我从下拉列表中选择一个第一个值也抛出空指针异常。 我的疑问是默认值ALL单击和第二次选择任何值返回null或dataTable中没有数据显

  • 问题内容: 我有一个ListView子类,当上下文操作栏(CAB)处于活动状态时,我可以对其进行选择。CAB设置为事件的回调: 很好,并且ListView可以按预期工作,当前选中的项目在触摸时保持突出显示。 当我关闭CAB时, 我希望ListView返回正常状态(即Touch模式) 。问题是,无论我尝试清除哪种方法,最后选择的项目都会无限期突出显示: 有什么建议? 问题答案: 出现此问题的主要原因

  • 我正在为listview的每个Iten使用listview实现复选框。我遇到的问题是,当我点击任何一个复选框时,当我滚动时,其他一些没有点击的复选框也会被随机点击。我在SO上通过了许多链接,但它并没有解决我的问题。 我的xml文件是

  • android L开发人员预览版中的标准列表视图选择器使用颜色控制亮点用于触摸的涟漪效果,并且在不聚焦状态下具有透明背景。 我想定义一个项目,它有一个彩色背景,并且仍然用相同的高亮颜色显示触摸时的涟漪效果。现在,如果我定义以下可绘制图形: 它起作用,但是纹波在 ListVIEW 项中间开始,不管触摸位置如何。如果我在 之外使用相同的背景,例如,对于 ,其工作原理与预期相同(纹波从触摸位置开始)。