Встраивание ListView внутри галереи - PullRequest
5 голосов
/ 02 января 2011

Цель состоит в том, чтобы реализовать Галерею, адаптер которой возвращает ListViews (другими словами, вертикально прокручиваемые ListViews, встроенные в горизонтально прокручиваемую Gallery). Это вроде работает после небольшой работы, но при попытке горизонтальной прокрутки ListView выглядит очень нервно, как будто есть некоторая липкость к центру. Я не наблюдал такого поведения с любым другим видом, встроенным в Галерею.

Вот что я пробовал:

Изначально я обнаружил, что ListView подавляет события касания, поэтому слушатель жестов в Галерее никогда не срабатывает.

Итак, в методе Activity действия onCreate () я создал GestureDetector:

galleryGestureDetector = new GestureDetector(this, gallery);

Затем, внутри метода getView () адаптера Gallery, после того, как ListView был раздут и настроен, у меня есть такой код:

listView.setOnTouchListener(new OnTouchListener() {
    public boolean onTouch(View v, MotionEvent event) {
        galleryGestureDetector.onTouchEvent(event);
        return true;
    }
});

В этом случае я даже пошел на крайний шаг по возвращению true из OnTouchListener, чтобы гарантировать, что метод onTouchEvent () listView никогда не вызывается. Такое же нервное поведение происходит. В результате я думаю, что могу исключить конкурирующие реализации onTouchEvent () между двумя представлениями.

Я также пытался злоупотребить концепцией TouchDelegate, расширив сенсорный прямоугольник галереи, включив в нее ListView, а затем заставив ListView делегировать ему, но это тоже было тщетным усилием.

Я бы поднял руки и сказал, что в настоящее время это невозможно, но приложение Social Networking, которое поставляется вместе с DroidX, каким-то образом это делает!

1 Ответ

5 голосов
/ 03 января 2011

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

public class BetterGallery extends Gallery {
private boolean scrollingHorizontally = false;

public BetterGallery(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

public BetterGallery(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public BetterGallery(Context context) {
    super(context);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    super.onInterceptTouchEvent(ev);
    return scrollingHorizontally;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    scrollingHorizontally = true;
    return super.onScroll(e1, e2, distanceX, distanceY);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    switch(event.getAction()) {
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_CANCEL:
        scrollingHorizontally = false;
    }

    return super.onTouchEvent(event);
}

}

Если вы используете BetterGallery вместо галереи,все работает просто отлично!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...