我似乎无法突出显示Android ListView

时间:2016-02-14 21:39:17

标签: android listview

当用户按下并释放它时,我正在尝试突出显示(更改背景颜色)ListView中的行(在发布后,突出显示仍然存在)。我已经阅读了几十篇帖子,两天后,我已经尝试过所有内容,但无法让它发挥作用。我读过帖子说这取决于你是使用鼠标还是触摸屏。有人说不能这样做。我的问题是:这可以在这个操作系统和触摸屏上完成吗?如果是这样,我怎么做(或者我做错了什么)?

我正在使用旧手机(2.2.3操作系统版本)。我读到了this bug。我也在扩展ArrayAdapter,因此每行可以有一个图像(图标)和文本。

以下代码段来自ListView的Activity xml。请注意choiceMode和listSelector:

    <ListView
    android:layout_width="match_parent"
    android:layout_height="178dp"
    android:id="@+id/listView"
    android:layout_gravity="center_horizontal"
    android:layout_weight="0.95"
    android:choiceMode="singleChoice"
    android:longClickable="false"
    android:clickable="false"
    android:listSelector="@drawable/list_view_selector"/>

由于这个旧操作系统中的错误,我为各种颜色的矩形形状创建了几个可绘制的xml文件,用于测试和调试我的尝试。这是list_selector_green.xml的一个:

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

    <solid android:color="#00ff00" />

</shape>

我的list_view_selector.xml文件是:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
    android:state_selected="false"
    android:state_pressed="false"
    android:drawable="@drawable/list_selector_red" />
<item
    android:state_selected="false"
    android:state_pressed="true"
    android:drawable="@drawable/list_selector_purple" />
<item
    android:state_selected="true"
    android:state_pressed="false"
    android:drawable="@drawable/list_selector_green" />
<item
    android:state_selected="true"
    android:state_pressed="true"
    android:drawable="@drawable/list_selector_orange" />
</selector>

我为点击事件创建了一个监听器。我在这里尝试过各种各样的东西(它们被评论出来)。

        myListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long arg3)
        {
            view.setSelected(true);
            //myListView.setSelection(position);
            //parent.requestFocusFromTouch(); // nothing gets selected
            //parent.setSelected(true); // something (ListView?) gets selected
            ///parent.setBackgroundColor(Color.GREEN); // makes whole listview background green
            //view.setBackgroundColor(Color.GREEN); // does nothing
            //parent.setSelection(position); // does nothing
        }
    });

所以,当我按下一个项目时,背景会改变颜色,但是当我释放时,它会回到“正常”,我相信它是透明的。我认为它的表现就像没有被选中一样。到目前为止我最接近的是调用parent.setSelected(true),我认为它选择了整个ListView。当我这样做时,第一次按下是紫色,第二次是橙色,所以系统似乎检测到某些东西被选中。它只是没有坚持下去。

还有一件事可能是相关的。请注意我的list_view_selector.xml文件中,如果state_selected和state_pressed为false,则颜色为红色。因此,我期待初始背景是红色的,但它不是 - 它是默认的(透明的?)。

1 个答案:

答案 0 :(得分:0)

忘掉我选择的setSelected andlet:

创建一个int数组,在onClick方法中检查数组是否包含位置,如果没有,则添加它。

现在你所要做的就是检查适配器中的getView方法,如果位置在数组中,如果是 - 请背景化。

以下是一些代码:

 if(!selected_messages.contains(position))
        {
            selected_messages.add(position);             

            getViewByPosition(position, conversation_list).findViewById(R.id.messageParent).setBackgroundColor(ContextCompat.getColor(context, R.color.background_selected_message));

        }


        /// CONTAINS

        else
        {
            selected_messages.remove(selected_messages.indexOf(position));


            getViewByPosition(position, conversation_list).findViewById(R.id.messageParent).setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
        }

getViewByPosition方法:

   public static View getViewByPosition(int pos, ListView listView)
{
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (pos < firstListItemPosition || pos > lastListItemPosition )
    {
        return listView.getAdapter().getView(pos, null, listView);
    }


    else
    {
        final int childIndex = pos - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}

并在适配器中:

  if(selected_messages.contains(position))
            {
                convertView.findViewById(R.id.background).setBackgroundColor(ContextCompat.getColor(chat, R.color.background_selected_message));
            }

            else
            {
convertView.findViewById(R.id.background).setBackgroundColor(ContextCompat.getColor(chat, android.R.color.transparent));
            }

最后,这是我用于数组的类,因为常规的类没有&#34;包含&#34;方法

 public static class Countable_arrayList_int extends ArrayList<Integer>
{

    @Override
    public boolean contains(Object o)
    {
        return indexOf(o) >= 0;
    }


}