6

我有一个安卓列表视图。当我单击一个列表视图项目时,我想更改列表视图项目背景。

然后之前选择的项目必须回到默认背景。这意味着只需选择一项。

我已经搜索了很长时间。我可以使用 onItemClick() 更改所选项目的背景

但我无法更改以前选择的项目。例如,如果我选择第二个项目,它就被改变了。然后我选择第三项。我的天啊!它也改变了!我能为此做些什么。我怎样才能得到以前的位置?

这是我的安卓代码。

private class ListViewItemClickListener implements
            AdapterView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            TextView title = (TextView) view.findViewById(R.id.title);
            title.setBackgroundResource(R.drawable.list_shape);

        }
    }
4

3 回答 3

4

您应该使用在列表视图中选择项目的内置方法。如您所见,手动更改背景容易出错。

将此属性添加到列表视图项 xml 中的根视图

android:background="?android:attr/activatedBackgroundIndicator"

然后调用setItemChecked(x, true)您的 ListView ,其中 x 是您要选择的项目的位置。

确保您的列表视图具有ChoiceMode允许选择的集合(例如“SingleChoice”)

于 2013-11-13T12:16:38.170 回答
2

当我在一个类似的例子中有这个时,我有一个名为的全局字段:

selectedListItem;

这将在您的 onitemClickListener 中更新,然后前一个项目的背景将恢复为默认值。

所以要更新你的代码:

private class ListViewItemClickListener implements
        AdapterView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
            long id) {
        //First update the previously selected item if one has been set
        if(selectedListItem!=null){
            TextView previousTitle = (TextView) selectedListItem.findViewById(R.id.title);
            previousTitle.setBackgroundResource(R.drawable.list_default_background);
        }
        //Then update the new one
        TextView title = (TextView) view.findViewById(R.id.title);
        title.setBackgroundResource(R.drawable.list_shape);
        selectedListItem = view;

    }
}

因此,只需selectedListItem将适配器中的字段初始化为onClickListener内部类,并使用默认背景绘制而不是list_default_background.

或者,您可以跟踪位置编号而不是实际视图。

编辑:

要为您的列表使用此方法,您还必须跟踪特定列表项的 ID 或对象实例。在我自己的解决方案中,在我的 ListAdapter 的 getView 方法中,我确保仅更新与正确项的 ID/实例匹配的列表项。使用您的代码方式,您还会发现,当您向下滚动此可见项目列表中相同位置的视图时,也会更新。这是因为列表视图指的是项目集合中的列表,其中每个集合对应于任何时候在屏幕上可见的项目。

要更新单个特定项目,您将更适合使用其他答案中提到的选择器背景或指示器。

高温高压

于 2013-11-13T12:07:29.977 回答
1

您可以在单击时更改 ListView 项目的颜色,如下所示。跟着这些步骤。

(记住,这是自定义列表视图)

  1. 在 Drawable 文件夹中创建一个 XML 文件,如下所示:

    <item android:drawable="@color/orange" android:state_focused="true"/>
    <item android:drawable="@color/orange" android:state_pressed="true"/>
    <item android:drawable="@drawable/listview"></item>
    

    选择你自己的资源。

  2. 在实现自定义 ListVIew 时,您将拥有自定义列表项设计的额外布局。下面是这样一个例子。

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="60dp"
        android:layout_height="60dp" />
    
    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:layout_toRightOf="@+id/imageView1"
        android:background="@drawable/listselect_picture"
        android:gravity="center"
        android:text="TextView"
        android:textColor="@drawable/select_txtcolor"
        android:textSize="16sp" />
    

在上面的代码中,我将步骤 1 中的 XML 文件设置为“背景”属性。这将按您的意愿工作。

此外,如果您还想更改 ListItem 选择的文本颜色,请使用下面的 XML 代码并将该 XML 文件设置为“TextColor”属性。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_selected="true" android:color="@android:color/white"/>
    <item android:state_focused="true" android:color="@android:color/white"/>
    <item android:state_pressed="true" android:color="@android:color/white"/>
    <item android:color="@android:color/black"/>

</selector>

上面的代码将在选择时将文本颜色更改为,并在未单击时恢复为原始颜色。

于 2013-11-13T12:45:07.283 回答