2

我想要达到的目标:

  • 当用户按下列表项时,它会突出显示
  • 当用户停止按下它时,列表项:
    • 如果在按下之前未选中,则保持突出显示
    • 失去高亮,如果它在按下之前被选中
  • 长按的行为与用户停止按下的行为相同(根据项目的先前状态更改项目的背景)
  • 滚动列表,而不按任何特定项目,不应突出显示任何项目

细节:

  • 对于我阅读的内容,我认为可以使用列表选择器和状态android:state_activated来实现该行为,但是这种状态是在 API 级别 11 中引入的。我正在寻找的解决方案必须在 API 级别 10 中工作
  • 我认为依赖单击(onItemClick,onClick...)的解决方案将不起作用,因为单击是在用户停止按下后触发的,而不是在他启动它时触发(就像按下状态一样)。使用android:state_pressed更改项目的突出显示不是持久的(它会在按下完成后变回)并在android:state_pressed中更改它并使其在单击时保持持久会产生闪烁
  • 在 API 级别 10 中实现这一目标的应用程序的一个很好的例子是Tasks。只需单击或长按列表中的项目即可查看所需的行为

那么,有人已经解决了吗?关于 Tasks 应用程序如何做到这一点的任何想法?

4

3 回答 3

1

您可能想在 row 上设置一个OnTouchListener(在方法中) 。这样,您将看到第一次触摸(动作)并可以设置选择:getViewViewMotionEventMotionEvent.ACTION_DOWN

    private OnTouchListener mTouchListener = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                v.setBackgroundColor(Color.RED); // set the selection
            }
            // don't forget to store this new status so the adapter will see
            // it. Otherwise you'll have some problems when the list will be
            // scrolled.
            return false;
        }
    };
于 2012-12-20T05:34:52.417 回答
0

我终于解决了实现我自己的 list( PressListView) 扩展的问题ListViewPressListView当列表中的项目被按下时,有一个回调来通知用户。

知道何时按下项目(这是最困难的部分),剩下的唯一事情就是以适当的方式处理项目的背景,您可以使用选择器在自己的适配器中执行此操作。

对于那些有兴趣看到这个完全工作的人,看看我的演示项目

您可以在项目中执行长按启动 CAB,一旦进入 CAB,您就可以通过触摸和方向键/触控板测试项目的突出显示。

尽管我的解决方案按我的意愿工作,但在更改项目状态时,它仍然比任务应用程序中的列表慢。如果您尝试非常快地选择两项,大多数情况下它不会选择我的示例中的一项,但它会在Tasks中选择。如果有人知道它可能是什么,我将非常感激!

于 2013-01-14T20:36:07.803 回答
0

在您的 ListView 上实现 ActionMode(请参阅下面的第二个链接)。在 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();
        }

请参阅https://stackoverflow.com/a/50639298/2477937https://medium.com/over-engineering/using-androids-actionmode-e903181f2ee3

于 2018-06-01T08:43:29.747 回答