Вложенная прокрутка ListView в API<21
Название понятно. У меня есть этот макет:
_________________
|_______________| <- Toolbar
|___|___|___|___| <- Tablayout
| |
| |
| ViewPager |
| |
|_______________|
Панель инструментов и табуляция находятся внутри AppBarLayout
, поэтому я могу использовать флаги прокрутки, чтобы скрыть панель инструментов при прокрутке вверх. Проблема в том, что это работает только с представлениями с вложенной прокруткой. Большинство вкладок - я имею в виду, большинство страниц - support.v4.NestedScrollView
s, так что все в порядке; другие есть (и должны быть) ListView
s.
С 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
вопрос,
Ребята на parse.com работают над версией RecyclerView.Adapter;
Есть бета-версия этого.
Я на самом деле 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 перехватывать их. Это просто и работает все время.
Если это не сработает, пожалуйста, скажите мне, чтобы я мог удалить этот ответ. Но, может быть, это кому-нибудь поможет, так как я тоже нашел этот вопрос, и, похоже, нет решения.