ListView如何清除选择[重复]

Posted

技术标签:

【中文标题】ListView如何清除选择[重复]【英文标题】:ListView How to clear selection [duplicate] 【发布时间】:2015-10-03 12:00:20 【问题描述】:

所以我在列表视图上有一个选择器,其中每行有 2 个text views,每个文本视图都有另一个同步选择器(相同状态的不同可绘制对象:activatedpressed)名单。我的逻辑是,当我在列表视图中检测到某个项目的一扔时,我会临时更改该视图的背景颜色,并在 500 毫秒后将其设置回透明。

但是,当它重置时,有时子视图的按下状态设置为 true,有时视图具有正确的 bg,但内部 text views 始终对应于它们的 activated drawables,即使按下状态为 false。

我似乎不知道如何纠正这种行为。非常感谢任何帮助,这件事让我发疯了。

我尝试清除无济于事的选择,我什至尝试显式强制子视图为其激活状态和按下状态设置为 false 也不起作用。我真的用尽了这个选项。

【问题讨论】:

你试过ListView.clearChoices(); 吗? @Machado 是的,这是我尝试的第一件事 您是否尝试在列表视图上发布更新?类似 getListView().post(new Runnable() @Override public void run() //do stuff here ); @RamandeepNanda nope 这也不起作用,因为当活动恢复时它再次在子视图上绘制一个选择器(除非我滚动列表) 【参考方案1】:

因此,在花了很多时间分析 AbsListView 的幕后情况后,我找到了解决此问题的方法。首先是关于导致此问题的问题,AbsListView 有 8 个状态用于运动检测,即 -

    TOUCH_MODE_REST (-1) TOUCH_MODE_DOWN (0) TOUCH_MODE_TAP (1) TOUCH_MODE_DONE_WAITING (2) TOUCH_MODE_SCROLL (3) TOUCH_MODE_FLING (4) TOUCH_MODE_OVERSCROLL (5) TOUCH_MODE_OVERFLING (6)

ACTION_UP 事件被派发到列表视图时,它的touchMode 卡在(2)和(5)之间,导致它记住motionView(Child view) 上的按下状态,这导致了不正确的结果即,即使动作完成,按下状态也是可见的。

我无法弄清楚为什么会出现这个问题,因为我总是将事件从我的TouchListener 发送到ListView

无论如何,现在解决这种情况 -

当我的GestureDetector 识别出一个手势时,它会返回真,所以我所要做的就是当GestureDetector 返回真时,只需将MotionEvent 的操作更改为ACTION_CANCEL 并将其发送到ListView瞧,问题解决了。

【讨论】:

以上是关于ListView如何清除选择[重复]的主要内容,如果未能解决你的问题,请参考以下文章

ListView数据在滚动时被清除[重复]

listview.setSelection()

通过自定义listView同时选择和搜索不起作用

1.2ListView优化之Viewholder

如何检查 ListView 项目是不是被选中

从 Delegate 访问 Listview currentIndex