0

所以我有一个有趣的问题。我有一个 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:在 ListView 打开时将项目设置为选中?

我发现 Romain Guy 的帖子“每当您触摸屏幕,在手机的任何位置,您都会进入所有应用程序的触摸模式。这是期望和预期的行为。” 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() 所以布局在每次方向变化时完全重建。

提前致谢!

贾里德

4

1 回答 1

0

尝试使用 Listview 的 setItemChecked(...) 方法。我已经看到当 Listview 设置为 CHOICE_MODE_SINGLE 时使用了相当多的方法,因为该模式确实使每个 listview 项目成为可检查的对象。

另请查看以下 QA,其中有人试图做类似的事情。似乎最简单的解决方案是为“已检查”项目创建不同的背景。

选择了 Android listview 数组适配器

于 2012-05-07T20:04:37.673 回答