【问题标题】:highlight selected row in listview突出显示列表视图中的选定行
【发布时间】:2014-04-01 11:03:13
【问题描述】:

我有一个包含列表视图和显示所选项目全部内容的 PagerView 的两个窗格布局。 我想要这两者之间的双向关系。

  • 当从列表视图中选择新项目时,项目将突出显示,ViewPager 显示相应的内容。
  • 当 ViewPager 滚动到新项目时。对应的项目将在列表视图中被选中。

我在 single_row.xml 文件中设置了背景颜色

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:padding="10dp"
            android:background="@drawable/bg_key"

    >


<ImageView
        .../>
<TextView
        .../>
<TextView
        .../>
 </RelativeLayout>

这是我的 drowable/bg_key.xml 文件

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

 <selector xmlns:android="http://schemas.android.com/apk/res/android">


<item android:state_selected="true"
      android:drawable="@color/pressed_color"
      />
<item
        android:drawable="@color/default_color" />
</selector>

我也使用了单选模式。

<ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@android:id/list"
        android:layout_gravity="center_horizontal"
        android:choiceMode="singleChoice" />

这是我的 ListItemClicked 事件处理程序。

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            communicator.indexChanged(position);
            view.setSelected(true);
        }
    });

一切都很完美!!除了不是一切。当我单击一个项目时,它将被选中并突出显示,并且 ViewPager 显示内容。但是当 ViewPager 滚动到新项目时,我无法在列表视图中突出显示相应的项目。

在 MyListFragment 中有一个名为 hightlightItem 的方法,当 PagerView 中的内容发生变化时会调用该方法。

 public void highlightItem(int position){
    //position is a index of item i want to hightlight using java. All code to here are tested!
    listView.setSelection(position); //? this will not select any item. Also it will remove the selected item as well
    listView.setChecked(position,true); //? doesn't work neither 
 }

那我该怎么办?我有一个项目索引,我想在这个方法中突出显示它。

【问题讨论】:

  • 抱歉,我没有注意到您已经为物品提供了selector。请看我对你的问题的回答。
  • 不,我没有。我确实在xml文件中设置了它。如果您再次查看我发布的代码,您会找到它。我不知道为什么这不起作用,但我得到了我想要的结果。
  • 是的,这就是我的意思。 &lt;selector&gt; 在 xml 中设置。我在两天前回答问题之前发表了该评论:)

标签: android android-layout listview android-listview


【解决方案1】:

要么添加listView.requestFocusFromTouch()

public void highlightItem(int position) {
    listView.requestFocusFromTouch();
    listView.setSelection(position);
 }

替代解决方案是在不请求焦点或设置选择的情况下调用listView.setItemChecked(position, true);,为此添加

<item android:state_activated="true" android:drawable="@color/pressed_color"/>

在你的 drowable/bg_key.xml 中

重要提示::哦,别忘了为你的列表设置选择模式,你需要做一次,即:

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

希望有帮助

【讨论】:

  • 感谢您的回答。第一个解决方案不起作用,但第二个解决方案完美。我之前试过这个,但我没有使用 android:state_activated="true" 而是使用 android:state_selected="true" 女巫会导致错误的效果。我还找到了另一个解决方案,我将作为答案发布。谢谢
  • 奇怪。对我来说,两种解决方案都可以正常工作。您可能忘记setChoiceMode 了吗?它们都需要工作。
  • 第一个解决方案不适用于包含多个项目的 ListViews。列表中的第一项突出显示得很好,但是当我导航到其他视图时,它们没有突出显示。选择可以正常工作,只是缺少视觉效果。
【解决方案2】:

kiruwka 的第二个解决方案完全有效,我正在我的项目中使用它。然而,这是我发现的另一个(稍微复杂一点的)解决方案。

public void highlightItem(int position){
    int selectedIndex = listView.getSelectedItemPosition();
    if(position != selectedIndex)
    {

        listView.performItemClick(
                listView.getAdapter().getView(position, null, null),
                position,
                listView.getAdapter().getItemId(position));
    }
}

【讨论】:

  • +1 表示贡献的动力。但是,我认为,尽管此解决方案对您来说可能没问题,但通常可能不希望为列表触发额外的 onItemClick 事件。例如,它会将您的 ViewPager 调整到指定位置并显示一些动画,而这实际上已经不需要(因为 ViewPager 的位置已经设​​置)。无论如何,这很有用,谢谢。
【解决方案3】:

试试这个:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        for (int j = 0; j < adapterView.getChildCount(); j++)
            adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT);

        // change the background color of the selected element
        view.setBackgroundColor(R.color.YOUR_COLOUR);
});

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 2012-06-10
    • 2013-12-22
    • 1970-01-01
    • 2013-10-26
    • 2013-09-07
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    相关资源
    最近更新 更多