Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android API级别10上,在操作模式(CAB)下更改按键上的列表项背景_Android_Android Layout_Android Listview_Android Selector - Fatal编程技术网

如何在Android API级别10上,在操作模式(CAB)下更改按键上的列表项背景

如何在Android API级别10上,在操作模式(CAB)下更改按键上的列表项背景,android,android-layout,android-listview,android-selector,Android,Android Layout,Android Listview,Android Selector,我想要达到的目标: 当用户按下列表项时,列表项将高亮显示 当用户停止按时,列表项: 如果在按下之前未选中,则保持高亮显示 如果在按下之前选择了高亮显示,则会丢失高亮显示 长时间单击的行为与用户停止按下按钮的行为相同(根据以前的状态更改项目的背景) 滚动不按任何特定项目,列表不应突出显示任何项目 详情: 就我所读到的内容而言,我认为可以使用列表选择器和状态android:state_activated,实现这种行为,但这种状态是在API级别11中引入的我正在寻找的解决方案必须在API级别

我想要达到的目标:

  • 当用户按下列表项时,列表项将高亮显示
  • 当用户停止按时,列表项:
    • 如果在按下之前未选中,则保持高亮显示
    • 如果在按下之前选择了高亮显示,则会丢失高亮显示
  • 长时间单击的行为与用户停止按下按钮的行为相同(根据以前的状态更改项目的背景)
  • 滚动不按任何特定项目,列表不应突出显示任何项目
详情:

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

有人已经解决了吗?知道Tasks应用程序是如何完成的吗?

您可能想在
视图
行的
上设置一个
OnTouchListener
(在
getView
方法中)。这样,您将看到第一次触摸时的
MotionEvent
(向下的
MotionEvent.ACTION
ACTION)并可以设置选择:

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

我最终解决了这个问题,实现了我自己的列表(
PressListView
)扩展
ListView
PressListView
有一个回调功能,可在按下列表中的某个项目时通知用户

知道何时按下项目(这是最困难的部分),剩下的唯一事情就是以正确的方式处理项目的背景,这可以在您自己的适配器中使用选择器来完成

对于那些有兴趣看到这一点充分发挥作用的人,请看我的

您可以启动CAB,在项目中执行长时间单击,进入CAB后,您可以使用触摸屏和D-pad/trackpad测试项目的高亮显示


虽然我的解决方案按照我的要求工作,但在更改项目状态时,它仍然比应用程序中的列表慢。如果您尝试快速选择两个项目,大多数情况下,它不会选择我示例中的一个项目,但它会选择。如果有人知道这是什么,我将非常感激

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

请参见和

您始终可以自己在适配器中处理行的选择。@Luksprog:是的,这就是我目前正在做的。但是为了实现我在问题中描述的行为,我仍然需要在某种程度上检测何时按下某个项,以便在适配器中更改该项的背景。如果我等待直到调用onItemClick来选择该项并通知适配器中的数据已更改,则当用户开始按该项时,我无法更改背景,但当用户停止按该项时,我无法更改背景。你知道怎么做吗?任务应用程序没有做任何特别的事情,那是一个CAB选择。如果这是你想要的,那么检查这个问题。我认为依赖单击(onItemClick,onClick…)的解决方案将不起作用-任务应用程序正是这样做的,以在进入下一个屏幕之前高亮显示该行(并注意它是否处于CAB选择模式)。长时间单击的行为与用户停止按下按钮的行为相同-这是在CAB中实现的,请参见上面的问题。@Luksprog:是的,我想要的是列表处于CAB模式时任务应用程序的行为。不久前,我查看了您链接的确切问题,但我想说的是,按照所选答案进行操作,只是在用户完成按压时更改列表项的背景,而不是在用户开始按压时。不过,我会再次检查并报告。请尝试一下该问题中的代码。如果你没有成功,请让我知道,这样我就可以尝试提供一个示例应用程序。对于实际的突出显示和删除突出显示,它非常有效!唯一不能正常工作的是,当你用手指滚动列表时,被触摸的列表项会改变其背景,这是不应该发生的。我想我会尝试在列表中使用一个手势检测器,看看它是如何工作的。Alexander,虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考@史瑞:好的,是吗