2012-05-07 4 views
0

У меня есть интересная проблема. У меня есть ListView, что я хочу поддерживать точный выбор строки и yoffset при изменении ориентации. В связи с этим я звоню:Есть ли способ ввода touchmode программно?

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 «Всякий раз, когда вы прикасаетесь к экрану, в любом месте в телефоне, вы входите тронуть режим для всех приложений Это желаемое и ожидаемое поведение. "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(), поэтому макет полностью перестраивается при каждом изменении ориентации.

Заранее благодарен!

Джаред

+0

Btw Я извиняюсь за уродливого расстояние кода я представил. У Stackoverflow есть странное ограничение форматирования. - Мне удалось исправить проблемы с интервалом. Сейчас это выглядит нормально. =) –

+0

Просто, чтобы быть ясным, установлен ли ваш список, чтобы использовать CHOICE_MODE_SINGLE, чтобы он мог сохранить последний выбранный элемент? – Gophermofur

+0

Это так, но при изменении ориентации весь вид воссоздается. Я попытался изменить режим выбора на все возможные варианты без эффекта. –

ответ

0

Попробуйте использовать метод setItemChecked (...) от Listview. Я видел, что это использовало справедливый бит, когда Listview установлен в CHOICE_MODE_SINGLE, так как этот режим действительно делает каждый элемент списка видимым объектом.

Также посмотрите на следующий QA, где кто-то пытался сделать что-то подобное. Похоже, что самым простым решением было создание другого фона для «проверенных» элементов.

Android listview array adapter selected

+0

К сожалению, это не влияет. Я не пытаюсь изменить фон выбранных элементов, я хочу нормальное нажатие. IE Я показываю список, на элемент списка нажимается, фон выбора списка элементов отображается на нужном элементе, и я обрабатываю щелчок. Проблема в том, что при изменении второй ориентации список считает, что он по-прежнему находится в местоположении по умолчанию (выбранный элемент 0), хотя он был прокручен в другую позицию. Поэтому, когда я нажимаю на любой элемент в списке, список перескакивает, хотя щелчок обрабатывается правильным элементом списка. –

Смежные вопросы