Android - ListView внутри галереи делает прокрутку не плавной - PullRequest
6 голосов
/ 14 июля 2010

Я реализовал галерею, и внутри нее у меня много списков слева направо.По какой-то причине Галерея прекрасно работает со всеми видами, но не со списком.При просмотре списка при просмотре галереи иногда возникают небольшие скачки.

У кого-нибудь есть идеи, как решить эту проблему?

некоторые примечания: Галерея использует адаптер, чтобы выяснить, чтопокажите, а затем создайте просмотр списка на основе адаптера

Спасибо

Ответы [ 4 ]

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

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

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);
    }
}

Кроме того, установите что-то подобное в упражнении, которое реализует галерею:

    ListView listView = (ListView) view.findViewById(R.id.users);
    listView.setAdapter(userListAdapter);
    listView.setOnTouchListener(new OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
        galleryView.onTouchEvent(event);
        return false;
        }           
    });

Наконец, добавьте onTouchEvent () к самой деятельности:

@Override
public boolean onTouchEvent(MotionEvent event) {
return galleryView.onTouchEvent(event);
}

Последнее замечание ... После полной реализации я обнаружил, что с точки зрения удобства использования было бы лучше расширить ViewAnimator с помощью пользовательского класса, который я назвал AdaptableViewAnimator, который, конечно, просто имел некоторые встроенные функции адаптера, и вставил ListView внутри него. Он не плавает так сильно, как ListView-inside-Gallery.

2 голосов
/ 02 августа 2010

Прокручиваемые предметы внутри других прокручиваемых предметов, как правило, имеют проблемы. Я не удивлен, что это не работает хорошо.

1 голос
/ 19 марта 2012

Это сработало для меня

listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
1 голос
/ 28 июня 2011

У меня была такая же проблема.И решение не простое.

    • Установите просмотр списка не фокусируемым в сенсорном режиме.

    listView.setFocusableInTouchMode(false);

    • Если вам нужен фокус, позвоните ему из слушателя onItemSelected.
  1. Используйте OnInterceptTouchEvent для получения событий Touch от вашего ребенка.И внесите некоторые изменения в onScroll и onTouchEvent вашей галереи

    OnItemSelectedListener mOnItemSelected = new OnItemSelectedListener()
    {   
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id)
        {
          view.requestFocusFromTouch();
        }
        @Override
        public void onNothingSelected(AdapterView<?> parent)
        {               
        }
    };
    
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        onTouchEvent(ev);
        return scrollingHorizontally;
    }
    
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        if(Math.abs(distanceX)>Math.abs(distanceY) || scrollingHorizontally == true){
            scrollingHorizontally = true;
            super.onScroll(e1, e2, distanceX, distanceY);
        }
        return scrollingHorizontally;
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch(event.getAction()) {
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            scrollingHorizontally = false;
            break;
        default:
                break;
        }
        super.onTouchEvent(event);
        return scrollingHorizontally;
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...