【问题标题】:How can I always highlight curent item in the listview?如何始终在列表视图中突出显示当前项目?
【发布时间】:2012-05-21 22:15:39
【问题描述】:

现在我正在使用:

android:listSelector="@drawable/bg_list_item"
android:drawSelectorOnTop="true"

bg_list_item.xml:

<?xml version="1.0" encoding="utf-8"?>

<item android:state_selected="true">
    <shape android:shape="rectangle">
        <gradient android:startColor="#0000ff"/>
    </shape>
</item>

<item android:state_focused="false"
      android:state_pressed="false"
      android:state_selected="false">
    <shape android:shape="rectangle">
        <gradient android:startColor="#ff0000"/>
    </shape>
</item>

但第一个项目不起作用,并且有时在滚动时(当我靠近列表视图的顶部/底部时)并没有在 listView.setSelection(index) 上突出显示选定的项目。

我必须以编程方式突出显示当前项目吗?

【问题讨论】:

标签: android android-listview


【解决方案1】:

定义一个自定义适配器并在其 getView() 方法中:

private int selectedItem;

// is used outside the adapter for example OnItemClickListener
public void setSelectedItem(int position) {
    selectedItem = position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
   //...
   // set selected item
    LinearLayout activeItem = (LinearLayout) rowView;
    if (position == selectedItem)
    {
       activeItem.setBackgroundResource(R.drawable.background_dark_blue);
    }
    else
    {
       activeItem.setBackgroundResource(R.drawable.border02);
    }
   //...
}

background_dark_blue.xml

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

    <item>
<shape android:shape="rectangle" >

            <solid android:color="@color/lightBlue6" />
            <!-- border width and color -->

            <stroke
                android:width="2dp"
                android:color="#FF0404B4" />

            <padding
                android:bottom="2dp"
                android:left="2dp"
                android:right="2dp"
                android:top="2dp" />
        </shape></item>

</layer-list>

border02.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle" android:layout_width="wrap_content">
            <stroke android:width="0.5dp" android:color="#FF000000" />
            <solid android:color="#FFFFFFFF" />
            <padding android:left="0dp" android:top="0dp" android:right="0dp"
                android:bottom="0dp" />
            <corners android:radius="0dp" />
        </shape>
    </item>


</layer-list>

【讨论】:

  • 接收邮件,请将 ActiveItem 更改为 activeItem)
【解决方案2】:

“android:listSelector”属性用于指定项目被点击时的背景。要突出显示第一个项目或单击后选择的项目,您需要以编程方式进行。

【讨论】:

    【解决方案3】:

    这是因为在触摸模式下没有选定的项目。请参阅here 了解说明。

    你可以用选择器来做,但它需要三件事......

    1) 您必须使列表行可选择

    getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    

    2) 在选择器文件中添加激活状态的条件:

        <item android:state_activated="true" >
            <shape android:shape="rectangle"> 
            <gradient android:startColor="#0000ff"/>
    

    3) 您需要创建一个自定义适配器来跟踪列表中每个位置的状态,以便在滚动时保持正确的状态。

    编辑

    breceivemail 的回答更适合您的需求。我的,虽然它可以工作,但对于多个检查的项目类型列表(通过将其更改为 CHOICE_MODE_MULTIPLE)会更好,并且比您需要的工作更多。

    【讨论】:

    • 我使用了 breceivemail 的答案以及您对 CHOICE_MODE_MULTIPLE 的评论,效果很好!谢谢!!!
    【解决方案4】:

    默认情况下,ListViews 没有chioceMode 设置(它设置为none),因此当前选择不会在视觉上指示。玩转choiceMode 属性将使您达到所需的方面。

    你也可以看看this solution,也许它也适合你。

    【讨论】: