Android列表视图项目背景更改

时间:2013-11-13 12:01:54

标签: android listview android-listview onclick position

我有一个Android列表视图。我想在单击一个列表视图项目时更改列表视图项目背景。

然后上一个选定的项目必须返回默认背景。这意味着只需要选择一个项目。

我已经搜索了很长时间了。我可以使用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);

        }
    }

3 个答案:

答案 0 :(得分:4)

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

将此属性添加到listview项目xml

中的根视图
android:background="?android:attr/activatedBackgroundIndicator"

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

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

答案 1 :(得分:1)

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

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 /实例匹配的列表项。使用您的代码时,您还会发现当您向下滚动视图时,此可见项列表中的相同位置也会更新。这是因为列表视图引用了项目集中的列表,其中每个集合对应于任何时候屏幕上可见的项目。

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

HTH

答案 2 :(得分:1)

您可以在单击时更改ListView项目颜色,如下所示。请按照以下步骤操作。

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

  1. 在Drawable Folder中创建一个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. 在实现Custom 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" />
    

  3. 在上面的代码中,我将第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>
    

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