9

I followed the official Android site's tutorial on creating contextual action menus. Using the code below, when I long press on one of my ListView items, it does become selected, but it does not visually indicate that its been selected. I am using the Holo Light theme, and I expect the background color of every selected item in my ListView to change to a shade of blue.

Is this normal behavior?

I have tried testing listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); and not even a single row will highlight.

Using listView.setSelector(android.R.color.holo_blue_light); does appear to highlight the row which was last selected, but it does not highlight the other rows which are selected.

Have I done something wrong, or do I need to make the background change manually? If so, how?

I have also tried listView.setSelector(android.R.drawable.list_selector_background); which is a real selector that contains items for different states. Unfortunately, it still only applies to the most recently selected ListView item.

public class MyActivity extends ListActivity {

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        // The list is generated here

        ListView listView = getListView();
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);

        listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {
            // implements empty methods
        }
    }
}

Thanks!

4

3 回答 3

2

我刚刚实现了上下文操作模式,并且遇到了与您相同的问题。我也认为默认行为是以某种方式突出显示每个选定的行,但不是。

获得所需效果的最简单方法是更改​​用于 ListActivity 的列表项资源。

我正在使用 ArrayAdapter,所以我的选择是在适配器的构造函数中进行的:

new ArrayAdapter<Exercise>(context, android.R.layout.simple_list_item_1);

最后一个参数是适配器将用于在列表视图中实例化新视图(列表项)的布局文件的资源 ID。

我选择了我认为是最基本的一个。通过将其更改为:

new ArrayAdapter<Exercise>(context, android.R.layout.simple_list_item_activated_1);

我得到了想要的效果,在上下文操作模式中选择的行现在保持突出显示。

在 android.R.layout 中还定义了一些其他资源 id,您可以从中选择以获得类似但不同的结果:http://developer.android.com/reference/android/R.layout.html, simple_list_item_activated_1 只是为我做的。

不知道

// The list is generated here 

隐藏一个适配器,如果是一个数组适配器,但如果是这样,这应该会有所帮助。

否则,我认为您可以在其他地方使用预定义的资源,或者采取稍长的方式并按照 Brabbeldas 的建议定义选择器

于 2014-04-30T12:34:45.140 回答
2

在我看来,描述的方式应该是可能的,但不幸的是它没有。

到目前为止,我发现您必须使用 XML 资源来描述当项目的“状态”被“激活”时背景的外观。

在“res/drawable/”目录中创建一个名为“list_item_background_activated.xml”的文件。

在其中定义类型选择器的根元素:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item 
    android:state_activated="true"
    android:drawable="@android:color/darker_gray" />

</selector>

现在您应该修改相关资源(定义 ListItem 外观的资源)以引用此可绘制对象:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_item_background_activated" >
    ...
</RelativeLayout>
于 2013-06-25T10:18:00.480 回答
0

在 ActionMode 中,当用户单击项目时,ListView 会自动跟踪项目检查状态。

当您为 ListView 使用适配器时,您可以根据选中状态设置项目的背景:

@Override
public void bindView(final View view, final Context context, final Cursor cursor)
{
    int pos = cursor.getPosition();

    boolean selected = ((SessionsActivity)context).listView.isItemChecked(pos);
    if(!selected)
        view.setBackgroundResource(R.drawable.list_selector);
    else
        view.setBackgroundResource(R.drawable.list_selector_active);
...

并且,您还需要在每个项目单击后使 ListView 无效:

 private AbsListView.MultiChoiceModeListener multiChoiceModeListener = new AbsListView.MultiChoiceModeListener()
    {
        @Override
        public void onItemCheckedStateChanged(ActionMode mode, int position,
                                              long id, boolean checked)
        {
            // Here you can do something when items are selected/de-selected,
            // such as update the title in the CAB
            listView.invalidateViews();
        }
于 2018-06-01T08:36:22.390 回答