Android recyclerview inside nestedscrollview

Nested RecyclerView In Android

A perfect guide to implement a recyclerview inside another recyclerview. Learn with MVVM

💥 Hello, In this article we are going to implement a nested recyclerview. We will learn how exactly nested recyclerview are made in real-time projects.

We can use a RecyclerView inside another RecyclerView. We refer to this as nested RecyclerView. Here are some pictures of nested recyclerview applications.

Prerequisites

  • Kotlin Language
  • Android RecyclerView
  • Hilt Dependency Injection
  • Retrofit
  • API_URL: https://game-of-thrones-quotes.herokuapp.com/v1/ houses

Why This Article? 🤔

Yeah, there are a lot of articles on this topic, but every article has its own way to represent data which is mainly static data. In this article we will build with API data.

Just Give me the Code,

iamnaran/template-recycler-view

A recycler view. Contribute to iamnaran/template-recycler-view development by creating an account on GitHub.

Let’s Get Started,

Step 1 — Setting up Model & API Data

An API that has a list of objects with the nested list of other objects. Take a look at the below API response. As we will integrate this public API into our application. Here, We have the Game Of Thrones API List which has a list of names of Houses and their nested Members list.

It’s important to understant data structure. I found many beginners developer were not able to understant API data structure which leads to bad development practice. So, Always understand model/data before you start your project.

Let’s SKIP our PEP talk and start coding Right! 👍

To generate KOTLIN model from JSON you can download this plugin ( JSON To Kotlin Class) in Android Studio. And, For JAVA look ( JSON To Java Class)

Now, Let’s create API Service to get responses from the above API URL. By breaking down our URL into BASE_URL & EndPoints.

Now, Let’s create our ViewModel to get this API Response

Here, HomeRepository acts as a repository class to get our response & PreferencesHelper acts as a helper class to store data in SharedPreference. You can see the project repository to understand it more clearly.

Step 2— User Interface Setup (XML)

Here, We will need three layouts,

  1. Activity UI, For Toolbar & Parent RecyclerView
  2. A Layout row Item for Parent RecyclerView — which consists of title & child recyclerview.
  3. A Layout row Item for Child RecyclerView.

Step 3— Setting up Adapter Classes

Several different classes work together to build our dynamic list. Here we have two recyclerview, which means we need two adapters. You define the adapter by extending RecyclerView.Adapter . You define the view holder by extending RecyclerView.ViewHolder . The layout manager arranges the individual elements in your list.

Remember Parent-Child Concept. Parent Adapter holds Child Adapter.

Let’s start with the child members adapter, where we will plot a list of members.

Читайте также:  Err address unreachable андроид

Now, Let’s work on our ParentHouseAdapter, It is main/parent recyclerview adapter from which we will call our child adapter.

Final Step — Integrate Adapter In View

We have our adapter ready, In our Activity, we will call our adapter after we get a response from our API.

Finally, The Output we get,

We are done here. We can always change our UI view with respect to our API.

Источник

RecyclerView Scrolling Issue with NestedScrollView

Although RecyclerView has a very good and smooth scrolling built-in, but when you put into any ScrollView , then your RecyclerView ’s scrolling will not work. For example,

Now, the RecyclerView will not scroll. To fix that, you will have to use NestedScrollView instead of ScrollView like this:

Now, the RecyclerView will scroll but it will not be smooth. It will stop as soon as finger is off the screen resulting in a very stucking scrolling. To fix this issue, all you have to do is add this line after RecyclerView s adapter has been set.

Now, your RecyclerView will work with smooth scrolling. This same technique can be used in ViewPager when each Fragment have RecyclerView and the ViewPager is inside any CollapsingToolbarLayout .

If you liked this article, you can read my new articles below:

Asynchronous Calls in Koltin

A very common task in any android app is to hit any web service call and fetch some data from server. Google have always recommended to perform such heavy or time consuming calls in background thread, as if performed in main thread, these can block the UI and make the app irresponsive Traditionaly, developers use AsyncTask for these sorts of computations.

May 20, 2018

Firebase Notifications in Background & Foreground in Android

When developers need to integrate push notifications in their Android apps, the first thing comes in mind is Firebase Notifications or Firebase Messaging. But when they integrate, there are few common issues which they stuck into.

May 19, 2018

7 years experience. 💻 Creator of various Open Source libraries on Android . 📝 Author of two technical books and 100+ articles on Android. 🎤 A passionate Public Speaker giving talks all over the world.

Источник

Как разместить RecyclerView внутри NestedScrollView?

С созданием NestedScrollView вы можете поместить прокрутку в другое прокручиваемое представление, если они реализуют NestedScrollingChild и NestedScrollingParent правильно.

(Это неплохой шаблон дизайна «Янь-Лейк» (от Google) на самом деле рекомендует помещать RecyclerView внутри вложенного просмотра: plus.google.com/u/0/+AndroidDevelopers/posts/9kZ3SsXdT2T «)

Я хочу поставить RecyclerView внутри NestedScrollView и, к счастью, RecyclerView реализует NestedScrollingChild, поэтому вы можете поместить его внутри NestedScrollView.

Я прочитал эти сообщения:

Но проблема с большинством проголосовавших решений состоит в том, что она вызывает все элементы RecyclerView , например, если это бесконечное RecyclerView, и когда пользователь достигает конца списка, который вы хотите сделать сетевым, тогда с это решение RecyclerView вызывает сервер повторно, потому что оно автоматически достигает последнего элемента RecyclerView .

В любом случае, как установить параметр, чтобы я мог поместить RecyclerView внутрь NestedScrollView . (на самом деле я хочу поставить группу просмотра как framelayout или relativelayout в качестве одного дочернего элемента nestedscrollview, а затем я хочу поместить recyclerview внутри framelayout или relativelayout )

Когда я помещаю RecyclerView внутри NestedScrollView , ничего не видно.

Чтобы создать образец проекта, вы можете использовать cheesesquare и изменить CheeseDetailActivity на наличие RecyclerView.

Читайте также:  Под какие системы распространение вирусов происходит наиболее динамично windows android mac os

Хотя ответ BNK неверен, но BNK много пробовал. Поэтому я награждаю его щедростью. Все еще ищет хорошее решение.

ОТВЕТЫ

Ответ 1

Следующий мой новый обновленный ответ:

Ответ 2

Вот решение для вызова сервера только тогда, когда вам действительно нужно загрузить больше данных. Таким образом, вы можете разместить бесконечное RecyclerView и многие другие виды внутри NestedScrollView. Для меня это хорошо работает.

1. Создайте класс EndlessParentScrollListener для обработки событий прокрутки из NestedSrollView.

2. Установить прослушиватель

Короткий xml, если кто-то найдет его полезным:

Ответ 3

Таким образом, RetyclerView внутри NestedScrollView будет, к сожалению, ничего не показывать. Тем не менее, есть способ поместить recyclerview внутри NestedScrollView косвенно — просто используйте frameLayout в качестве третьей стороны для хранения вашего recyclerview.

Это frameelayout, который содержит вложенный recyclerview в вашем классе activity:

Поместите фрагмент в framelayout (код находится в классе activity):

В exampleFragment вы можете переустановить его.

Это фрагмент:

Ниже представлен XML-макет CheeseSquare, который вы должны иметь:

Источник

Как использовать RecyclerView внутри NestedScrollView?

Как использовать RecyclerView внутри NestedScrollView ? RecyclerView содержимое не видно после настройки адаптера.

ОБНОВЛЕНИЕ Код макета обновлен.

Замените свой recyclerView на,

будет управлять остальными вещами.

Еще одна вещь, нет необходимости помещать свой RecyclerView внутри NestedScrollView

ОБНОВЛЕНИЕ 1

Начиная с библиотеки поддержки Android 23.2.0 был добавлен метод setAutoMeasureEnabled(true) для LayoutManager. Это делает RecyclerView, чтобы обернуть его содержимое и работает как шарм.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

Так что просто добавьте что-то вроде этого:

ОБНОВЛЕНИЕ 2

С 27.1.0 setAutoMeasureEnabled устарела, вы должны предоставить пользовательскую реализацию LayoutManager с переопределенным методом isAutoMeasureEnabled()

Но после многих случаев использования RecyclerView я настоятельно рекомендую не использовать его в режиме обтекания , потому что это не то, для чего он предназначен. Попробуйте провести рефакторинг всего макета, используя обычный RecyclerView с несколькими типами элементов. Или используйте подход с LinearLayout, который я описал ниже как последнее средство

Старый ответ (не рекомендуется)

Вы можете использовать RecyclerView внутри NestedScrollView . Прежде всего, вы должны реализовать свой собственный обычай LinearLayoutManager , он заставляет вас RecyclerView обернуть его содержимое. Например:

После этого используйте это LayoutManager для вашего RecyclerView

Но вы также должны вызвать эти два метода:

Здесь setNestedScrollingEnabled(false) отключите прокрутку для RecyclerView , чтобы он не перехватывал событие прокрутки от NestedScrollView . И setHasFixedSize(false) определите, что изменения в содержимом адаптера могут изменить размер RecyclerView

Важное примечание: в некоторых случаях это решение немного глючит и имеет проблемы с производительностью, поэтому, если у вас много элементов, RecyclerView я бы порекомендовал использовать настраиваемую LinearLayout реализацию представления списка, создать для него аналог Adapter и сделать его вести себя как ListView или RecyclerView

Источник

Как использовать RecyclerView внутри NestedScrollView?

Как использовать RecyclerView внутри NestedScrollView ? Содержимое RecyclerView не отображается после установки адаптера.

Обновлен код макета UPDATE .

Замените ваш recyclerView,

Будет управлять остальными вещами.

Еще одна вещь, не нужно ставить ваш recyclerView внутри NestedScrollView

Вы можете использовать RecyclerView внутри NestedScrollView . Прежде всего, вы должны реализовать свой собственный LinearLayoutManager , он заставит RecyclerView обернуть его содержимое. Например:

После этого используйте этот LayoutManager для вашего RecyclerView

Но вы также должны назвать эти два метода:

Здесь setNestedScrollingEnabled(false) отключает прокрутку для RecyclerView , поэтому он не перехватывает прокручивание события из NestedScrollView . И setHasFixedSize(false) определяет, что изменения в содержимом адаптера могут изменить размер RecyclerView

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

Обновление №1:

В некоторых случаях это решение немного затруднительно и имеет проблемы с производительностью, поэтому, если у вас много элементов в RecyclerView я бы рекомендовал использовать пользовательскую реализацию списка на основе LinearLayout , создать для него аналоговый адаптер и заставить его вести себя Как ListView или RecyclerView

Читайте также:  Launcher iphone для андроида

Обновление №2 (важно!):

В Android Support Library 23.2.0 для LayoutManagers был добавлен метод setAutoMeasureEnabled(true) . Это позволяет RecyclerView обертывать контент и работает как шарм.
http://android-developers.blogspot.ru/2016/02/android-support-library-232.html

1) Вам необходимо использовать библиотеку поддержки 23.2.0 (или) выше

2), а высота recyclerView будет wrap_content.

3) recyclerView.setNestedScrollingEnabled (false)

Но при этом шаблон recycler не работает. (Т. Е. Все представления будут загружены сразу, потому что wrap_content требуется высота полного recyclerView, чтобы он сразу рисовал все виды ресайклеров. Никакое представление не будет переработано). Старайтесь не использовать этот шаблон, если это действительно не требуется. Попробуйте использовать viewType и добавьте все другие виды, которые нужно прокрутить до recyclerView

Вы можете использовать android:fillViewport=»true» чтобы NestedScrollView RecyclerView . RecyclerView заполнит оставшуюся высоту. Поэтому, если вы хотите прокрутить NestScrollView , вы можете установить minHeight RecyclerView .

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

Просто добавьте recyclerView.setNestedScrollingEnabled(false); Прежде чем setAdapter сам работал для меня. Я не добавлял app:layout_behavior=»@string/appbar_scrolling_view_behavior» любом месте и не устанавливал какой-либо пользовательский менеджер макетов

LayoutManager библиотеки делает RecyclerView обертывает его содержимое. В этом случае RecyclerView будет «размером с внутренние виды», поэтому у него не будет полосы прокрутки, и пользователь будет использовать возможности прокрутки NestedScrollView. Поэтому он не будет двусмысленным, как «прокручиваемый внутри прокручиваемого».

Существует простой и тестовый код, который можно проверить

Вот код, который я использую, чтобы избежать прокрутки:

Я использовал RecyclerView внутри NestedScrollView, и он работал для меня. Единственное, что я должен был иметь в виду, это то, что NestedScrollView принимает только один дочерний вид. Так что в моем случае я использовал группу LienearLayout viewgroup, в которой находился мой RecyclerView, а также ряд других просмотров, которые мне нужны.

У меня возникла одна проблема с установкой моего RecyclerView внутри NestedScrollView. Я понял, что прокрутка содержимого моего RecyclerView вяло.

Позже я понял, что мой RecyclerView получает событие прокрутки и поэтому противоречит прокручиванию поведения NestedScrollView.

Поэтому для решения этой проблемы мне пришлось отключить функции прокрутки моего RecyclerView с помощью этого метода movieListNewRecyclerView.setNestedScrollingEnabled(false);

Вы можете проверить мою Instagram для короткого видео о том, что я на самом деле сделал. Это мой дескриптор instalk ofelix03

Нажмите на это изображение, чтобы посмотреть, что я сделал

Если вы используете RecyclerView-23.2.1 или новее. Следующее решение будет работать очень хорошо:

В вашем макете добавьте RecyclerView следующим образом:

И в вашем java-файле:

Здесь layoutManager.setAutoMeasureEnabled(true); Сделают трюк.

Ознакомьтесь с этой проблемой и этим блогом разработчиков для получения дополнительной информации.

Вы не можете использовать просмотр recycler внутри вложенного представления прокрутки. Он не предназначен для размещения других прокручиваемых представлений, но это связано с тем, что он является дочерним элементом самого прокручиваемого макета, в котором вам нужно вложенное прокручивание. У меня была одна и та же проблема, но в конце я переместил текстовое представление как headerview в recyclerview, сделал recyclerview прямым дочерним положением координатора и удалил вложенное представление прокрутки. Тогда все мои проблемы исчезли.

У меня есть Viewpager и RecyclerView внутри NestedScrollView. После добавления строк ниже

Я решил проблему медленного прокрутки и прокрутки.

Мне пришлось реализовать CoordinatorLayout с прокруткой панели инструментов, и это просто заставило меня весь день возиться с этим. У меня есть работа, удалив NestedScrollView. Поэтому я просто использую RelativeLayout в корне.

Источник

Оцените статью