【问题标题】:ListView items don't become visually "highlighted" when selected during contextual action mode在上下文操作模式下选择时,ListView 项目不会在视觉上“突出显示”
【发布时间】:2013-04-04 21:40:40
【问题描述】:

我关注了 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
        }
    }
}

谢谢!

【问题讨论】:

  • 您是否设法进入上下文操作视图?我一直在尝试做同样的事情,但没有运气。试图达到和Jelly Bean闹钟ListView效果一样的效果,在item长按时进入删除模式。

标签: android android-layout android-widget


【解决方案1】:

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

到目前为止,我发现您必须使用 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>

【讨论】:

    【解决方案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 的建议定义选择器

    【讨论】:

      【解决方案3】:

      在 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();
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        相关资源
        最近更新 更多