【发布时间】:2012-05-07 18:42:48
【问题描述】:
所以我有一个有趣的问题。我有一个 ListView,我想在方向更改时保持准确的行选择和 yoffset。因此我称之为:
list.postDelayed(new Runnable() {
@Override
public void run() {
list.requestFocusFromTouch();
list.setSelectionFromTop(finalPosition, yoffset);
}
},100);
看起来很简单,而且效果很好。问题是当我改变方向两次(回到原来的方向,即横向->纵向->横向)时,列表退出了TouchMode,即list.isInTouchMode()返回false(在第一次方向改变时,列表.isInTouchMode() 返回 true,一切都很好,点击工作等)。因此,当您使用 setSelectionFromTop() 以编程方式滚动列表视图并单击列表中的项目而不先触摸应用程序中的其他位置时,列表会跳转并滚动到我单击的位置,突出显示错误的项目。这很烦人,我似乎找不到解决办法。欢迎任何想法和建议。
调用 list.requestFocusFromTouch() 似乎对设置 TouchMode 没有影响。
更多信息: Android:To set an item as selected when the ListView opens?
我发现了 Romain Guy 的帖子“每当你触摸屏幕,在手机的任何位置,你都会进入 touch 所有应用程序的模式。这是期望和期望的 行为。 " http://groups.google.com/group/android-developers/browse_thread/thread/590b02939d14675b/077ad77e4217e56e?lnk=gst&q=[android]+scroll+listview+not+in+touchmode#077ad77e4217e56e
我想要做的就是以某种方式进入 TouchMode 而不强迫用户在第二次方向改变时实际触摸设备。我曾多次尝试 list.dispatchTouchEvent() 。我可能发送了错误的运动事件:
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN ,
list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_MOVE ,
list.getWidth(), list.getHeight(), 0));
list.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP ,
list.getWidth(), list.getHeight(), 0));
另一种选择是找出我们不再处于 TouchMode 的原因。我没有覆盖 onConfigurationChanged() 所以布局会在每次方向改变时完全重建。
提前致谢!
贾里德
【问题讨论】:
-
顺便说一句,我为我提交的代码的丑陋间距道歉。 Stackoverflow 有一个奇怪的格式限制。 - 我设法解决了间距问题。现在看起来更正常了。 =)
-
澄清一下,您的列表视图是否设置为使用 CHOICE_MODE_SINGLE 以便保留最近选择的项目?
-
是的,但是在方向更改时会重新创建整个视图。我尝试将选择模式更改为所有可能的选项,但没有效果。
标签: android listview android-layout