当用户按下并释放它时,我正在尝试突出显示(更改背景颜色)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,则颜色为红色。因此,我期待初始背景是红色的,但它不是 - 它是默认的(透明的?)。
答案 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;
}
}