如何在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,虽然这个链接可以回答这个问题,但最好在这里包含答案的基本部分,并提供链接供参考@史瑞:好的,是吗