【问题标题】:Android listview item background changeAndroid listview项目背景变化
【发布时间】:2013-11-13 12:01:53
【问题描述】:

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

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

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

        }
    }

【问题讨论】:

    标签: android listview android-listview onclick position


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我只是想写和评论一样的东西:)
    【解决方案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/实例匹配的列表项。使用您的代码方式,您还会发现,当您向下滚动此可见项目列表中相同位置的视图时,也会更新。这是因为列表视图引用了一组项目中的列表,其中每组对应于任何时候在屏幕上可见的项目。

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

    HTH

    【讨论】:

    • 嗨塞尔文。这将解决 OP 的要求。视图背景被重新应用到每个可见列表的问题是一个单独的问题,是由初始方法引起的。
    • 不,它不会...因为 listview 正在重用项目!如果您“选择”项目,则将此项目从可见项目中滚动出来 1. 可以“选择”其他一些项目 2. 如果您使该项目滚动回可见项目,则该项目可能不会再次被选中!故事结束
    • 是的,但这是一个单独的问题。用户在选择我的回答正确回答的新项目时询问如何取消选择上一个项目。我相信您的评论属于问题:)
    【解决方案3】:

    您可以在单击时更改 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2014-06-20
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      相关资源
      最近更新 更多