安卓ListView项背景更改

6

我有一个Android的ListView。当我点击其中一个ListView项目时,我想要更改ListView项目的背景。

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

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

但我无法更改先前选择的项目。例如,如果我选择第二个项目,它会更改。然后我选择第三个项目。哦天啊!它也被更改了!我该怎么办?如何获取以前的位置?

以下是我的Android代码。

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);

        }
    }
3个回答

4

您应该使用ListView中内置的选择项目方法。手动更改背景容易出错,正如您所发现的那样。

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

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

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

确保您的ListView设置了允许选择的ChoiceMode(例如“SingleChoice”)


我只是想写成注释一样的东西 :) - Selvin

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 /实例匹配的列表项。随着代码的运行方式,您还会发现当您滚动时,在此列表中可见项目相同位置的视图也会更新。这是因为ListView将列表分组为项集,其中每个集合对应于任何一次屏幕上可见的项目。为了更新一个特定的单一项,最好使用选择器背景或指示器,如其他答案中所提到的那样。希望有所帮助。

嗨Selvin。这将解决OP所问的问题。视图背景被重新应用于每个可见列表的问题是一个单独的问题,由初始方法引起。 - sturrockad
不会的,因为ListView正在重用项目!如果您“选择”项目并将其滚动到不可见项目之外,则可能会选择其他项目。如果您使此项目滚动回可见项目,则该项目可能再次未被选择!故事结束。 - Selvin
是的,但那是一个不同的问题。用户问如何在选择新项目时取消选择先前的项目,我的回答正确地回答了这个问题。我认为你的评论应该放在问题下面 :) - sturrockad

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文件设置为“background”属性。这将按照您的要求工作。
此外,如果您还想在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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接