Как включить прокрутку на простом адаптере на прошивке Google Glass X16

После обновления моих Google Glass до XE16 мой список, который я создал с помощью простого адаптера, больше не может прокручиваться. Есть ли способ вручную включить прокрутку с помощью GDK или исправить эту проблему?


person BarryK88    schedule 16.04.2014    source источник
comment
Я сообщил о нарушении прокрутки ListView в XE16 и 16.1 здесь - code.google.com/p/google-glass-api/issues/detail?id=484   -  person Sean Barbeau    schedule 22.04.2014


Ответы (1)


Мой список также перестал прокручиваться с обновлением X16. Вы можете создать прокрутку назад, выполнив следующие действия:

В методе onCreate вашей активности обязательно:

  1. установить режим выбора списка
  2. установите для свойства clickable списка значение true.
  3. установить onItemClick слушателя списка
  4. создать детектор жестов (см. ниже)

Например:

myListView = (ListView)findViewById(R.id.MY_LIST_VIEW);
if(myListView != null){
    myListView.setAdapter(mAdapter);
    myListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    myListView.setClickable(true);

    myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
         public void onItemClick(AdapterView<?> parent, View view, int position, long id){
            Log.d("MY_LOG", "click at position " + position);
         }
    });
}

mGestureDetector = createGestureDetector(this);

Теперь нам нужно написать новый метод для вызова createGestureDetector() выше (последняя строка). По сути, вы можете изменить код, указанный в документах GDK, для прокрутки вверх и вниз на основе жестов SWIPE_LEFT и SWIPE_RIGHT. Обратите внимание, что в приведенном выше коде я присвоил свой listView переменной с именем myListView. Вот пример метода для детектора жестов, который будет прокручиваться на основе жестов смахивания:

private GestureDetector createGestureDetector(Context context) {
    GestureDetector gestureDetector = new GestureDetector(context);
    //Create a base listener for generic gestures
    gestureDetector.setBaseListener( new GestureDetector.BaseListener() {
        @Override
        public boolean onGesture(Gesture gesture) {
            if (gesture == Gesture.TAP) { // On Tap, generate a new number
                return true;
            } else if (gesture == Gesture.TWO_TAP) {
                // do something on two finger tap
                return true;
            } else if (gesture == Gesture.SWIPE_RIGHT) {
                // do something on right (forward) swipe
                myListView.setSelection(myListView.getSelectedItemPosition()+1);
                return true;
            } else if (gesture == Gesture.SWIPE_LEFT) {
                // do something on left (backwards) swipe
                myListView.setSelection(myListView.getSelectedItemPosition()-1);
                return true;
            }
            return false;
        }
    });
    gestureDetector.setFingerListener(new GestureDetector.FingerListener() {
        @Override
        public void onFingerCountChanged(int previousCount, int currentCount) {
          // do something on finger count changes
        }
    });
    gestureDetector.setScrollListener(new GestureDetector.ScrollListener() {
        @Override
        public boolean onScroll(float displacement, float delta, float velocity) {
            // do something on scrolling

            return false;
        }
    });
    return gestureDetector;
}

Надеюсь это поможет!

person adamup    schedule 18.04.2014
comment
Круто! Большое спасибо за помощь, теперь все работает. Одна вещь; Мне также нужно было добавить эти импорты import com.google.android.glass.touchpad.Gesture; импортировать com.google.android.glass.touchpad.GestureDetector;. - person BarryK88; 19.04.2014
comment
Ух ты! Есть идеи, почему это изменилось в XE16? У меня есть то, что похоже на ту же проблему в PreferenceFragment, который, как я полагаю, содержит ListView. stackoverflow.com/questions/23160084/ К сожалению, я не знаю, как получить дескриптор ListView в PreferenceFragment или программно получить/установить его позицию прокрутки с помощью GestureDetector. - person swooby; 19.04.2014
comment
Пока без понятия. Я копал, но не понял, что изменилось. Дайте мне знать, если вы что-нибудь обнаружите. - person adamup; 19.04.2014
comment
Похоже, что эта проблема также затрагивает AlertDialogs — код. google.com/p/google-glass-api/issues/detail?id=326#c2 - person Sean Barbeau; 22.04.2014
comment
(Копирование здесь, чтобы все ответившие были уведомлены) Я подал заявку на неработающую прокрутку ListView на XE16 и 16.1 здесь - code.google.com/p/google-glass-api/issues/detail?id=484 - person Sean Barbeau; 23.04.2014
comment
Как я отметил в stackoverflow.com/a/23164323/937715, чтобы это работало с ListActivity, вам необходимо переопределить onGenericMotionEvent (событие MotionEvent) и передайте их GestureDetector, как показано на stackoverflow.com/q/23160084/937715. - person Sean Barbeau; 23.04.2014
comment
к сведению: я разместил вопрос о рекомендуемых методах работы с вертикальными списками в сообществе разработчиков Glass на G+ – plus. google.com/104230720789224785692/posts/cpzD4xjjJbo - person Sean Barbeau; 24.04.2014
comment
@adamup что, если меньше элементов (например, два элемента), которые не активируют прокрутку? Как получить setOnItemClickListener? Я попробовал код, но setOnItemClickListener не работает? Любое улучшение по этому поводу? - person hrskrs; 26.05.2015