【问题标题】:Listview and row selector not workingListview 和行选择器不起作用
【发布时间】:2014-02-14 17:14:07
【问题描述】:

我对此感到困惑。我正在搜索超过 2 小时,但无法理解发生了什么。

我有一个列表视图,我希望项目(行)可以选择。 为此,我将一个选择器设置为行布局的背景。

ListView 在 fragment.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);
    }

我现在的问题是,当列表视图滚动时,我显然想保持选择状态。所以我有一个条件,我检查并基于此将行设置为选中或不选中,如您在

中所见
row.setSelected(boolean condition);

问题在于,虽然某些行的条件为真,但该行的背景选择器不起作用,并且该行没有高亮显示。

我已经尝试了所有方法,但找不到这里发生的哔哔声。

有什么建议吗?

【问题讨论】:

  • row.setSelected(boolean condition); 您是否将参数与数据类型一起传递?应该是这样的boolean condition; ..... row.setSelected(condition);
  • 这只是为了解释我的工作。条件是基于条件定义的布尔值。是truefalse
  • 你如何使这个“条件”变量?
  • 似乎太多人错误地关注布尔条件。我可以将其硬编码为 true,这通常应该选择所有行并将它们全部突出显示,但它不会选择任何行。为了避免混淆,我稍微更改了代码,虽然这是一个示例
  • 我记得我曾经遇到过类似的问题,但我唯一记得的是我必须交换侦听器的顺序并设置选择。虽然它带有一个checkedStateChangeListener。我真的不知道它是否会有所帮助,但你可以尝试一下。

标签: android listview android-listview


【解决方案1】:

我一直在玩,我想我找到了解决您问题的方法。这个适用于list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

您可以通过list.getCheckedItemPositions()获取所选项目。唯一奇怪的是,在你的选择器中你必须使用android:state_activated而不是android:state_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>

希望这会有所帮助。

【讨论】:

  • 要选择一行,我将使用row.setChecked(true) ?
  • 不,实际上这是我使用的全部代码。一旦您设置ListView.CHOICE_MODE_MULTIPLE,该列表显然会处理选中的项目
  • 您是否将选择器设置为它自己作为属性的列表视图?
  • 不,我使用了你的 row_contact.xml,其中选择器是 LinearLayout 的背景。
  • 我实际上只有通过使用mListView.setItemChecked(position, true); 选择我自己的项目才能使其工作,但它终于工作了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多