在上下文操作模式期间选择时,ListView项目不会在视觉上“突出显示”

时间:2013-04-04 21:40:41

标签: android android-layout android-widget

我关注了官方Android网站的tutorial on creating contextual action menus。使用下面的代码,当我长按其中一个ListView项目时, 会被选中,但它不会在视觉上表明它已被选中。我正在使用Holo Light主题,我希望ListView中每个选定项目的背景颜色都变为蓝色。

这是正常行为吗?

我已经尝试过测试listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);,甚至连一行都不会突出显示。

使用listView.setSelector(android.R.color.holo_blue_light);确实会突出显示上次选中的行,但它不会突出显示所选的其他行。

我做错了什么,或者我是否需要手动进行背景更改?如果是这样,怎么样?

我也试过listView.setSelector(android.R.drawable.list_selector_background);这是一个真正的选择器,包含不同状态的项目。不幸的是,它仍然只适用于最近选择的ListView项目。

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
        }
    }
}

谢谢!

3 个答案:

答案 0 :(得分: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的外观的资源)来引用这个drawable:

<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>

答案 1 :(得分:1)

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

让我获得所需效果的最简单方法是更改​​我用于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建议

答案 2 :(得分: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);
...

AND,在每个项目点击后,您还需要使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();
        }