有没有办法以编程方式进入触摸模式?

时间:2012-05-07 18:42:48

标签: android listview android-layout

所以我有一个有趣的问题。我有一个ListView,我想在方向更改上保持确切的行选择和yoffset。我这样称呼:

list.postDelayed(new Runnable() {
        @Override
        public void run() {
            list.requestFocusFromTouch();
            list.setSelectionFromTop(finalPosition, yoffset);
        }
    },100);

看起来很简单,效果很好。问题是,当我更改方向两次(返回原始方向,即横向 - >纵向 - >横向)时,列表已退出TouchMode,即list.isInTouchMode()返回false(在第一个方向更改时) ,list.isInTouchMode()返回true,一切都很棒,点击工程等)。因此,当您使用setSelectionFromTop()以编程方式滚动列表视图并单击列表中的项目而不首先触摸应用程序中的其他位置时,列表会跳转并滚动到我单击的位置,突出显示错误的项目。这很烦人,我似乎无法找到它的解决方案。任何想法和建议都是最受欢迎的。

调用list.requestFocusFromTouch()似乎对设置TouchMode没有影响。

更多信息: Android:To set an item as selected when the ListView opens?

我发现了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(),因此在每次方向更改时都会完全重建布局。

提前致谢!

贾里德

1 个答案:

答案 0 :(得分:0)

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

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

Android listview array adapter selected