Вложенная прокрутка ListView в API<21

Название понятно. У меня есть этот макет:

_________________
|_______________| <- Toolbar    
|___|___|___|___| <- Tablayout
|               |
|               |
|   ViewPager   |
|               |
|_______________|

Панель инструментов и табуляция находятся внутри AppBarLayout, поэтому я могу использовать флаги прокрутки, чтобы скрыть панель инструментов при прокрутке вверх. Проблема в том, что это работает только с представлениями с вложенной прокруткой. Большинство вкладок - я имею в виду, большинство страниц - support.v4.NestedScrollViews, так что все в порядке; другие есть (и должны быть) ListViews.

С Lollipop я могу просто добавить android:nestedScrollingEnabled="true" к представлению списка, и панель инструментов правильно скрывается при прокрутке.

В API<21 такого атрибута нет, и панель инструментов не скрывается. Что еще более важно, самые последние элементы в списке скрыты из-за некоторой ошибки измерения в CoordinatorLayout: listview действует так, как если бы он занимал пространство, занимаемое в данный момент панелью инструментов.

Решения:

  • Переключиться на RecyclerView, который поддерживает вложенную прокрутку: я не могу, потому что мне нужно использовать адаптер внешней библиотеки, который работает только с представлениями адаптера и который я не могу заменить (а именно, ParseQueryAdapter);

  • простираться ListView и реализовать вложенную прокрутку: кажется сложным;

  • простираться ListView и реализовать какой-то обходной путь, например, измерение вещи, чтобы избежать проблемы с последним элементом, или (и) пользовательское поведение, чтобы скрыть панель инструментов: тоже кажется сложным;

  • Используйте какой-то трюк с макетом: ничего не найдено.

Любая помощь?

Например, я (отчаянно) пытался:

<android.support.v4.widget.NestedScrollView
    android:nestedScrollingEnabled="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</android.support.v4.widget.NestedScrollView>

Но так ListView не выложен как match_parent, Я получаю небольшое представление с небольшой высотой, а остальная часть страницы пуста.

3 ответа

Решение

К сожалению, нет способа заставить вложенную прокрутку работать на ListView - иначе не потребуются изменения, которые были сделаны в API 21.

Вы заметите, что текущий Parse SDK фактически удален ParseQueryAdapter полностью. Учитывая это, возможно, имеет смысл начать строить свой собственный RecyclerView основанный адаптер, использующий API-интерфейсы запросов Parse напрямую.

Для тех, кто заинтересован в конкретном ParseQueryAdapter вопрос,

Я на самом деле Xamarin разработчик, поэтому я не могу проверить, работает ли это в данном конкретном случае, но я нашел ответ, который помог мне вXamarinтак что я поделюсь этим:

Я нашел решение, которое отлично работает и может без проблем прокрутить ListView:

ListView lv = (ListView)findViewById(R.id.myListView);  // your
listview inside scrollview lv.setOnTouchListener(new
ListView.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            // Disallow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(true);
            break;

        case MotionEvent.ACTION_UP:
            // Allow ScrollView to intercept touch events.
            v.getParent().requestDisallowInterceptTouchEvent(false);
            break;
        }

        // Handle ListView touch events.
        v.onTouchEvent(event);
        return true;
    }
});

Это отключает TouchEvents в ScrollView и заставляет ListView перехватывать их. Это просто и работает все время.

Если это не сработает, пожалуйста, скажите мне, чтобы я мог удалить этот ответ. Но, может быть, это кому-нибудь поможет, так как я тоже нашел этот вопрос, и, похоже, нет решения.