Это будет самый длинный пост, и я не буду злиться, если этот вопрос будет закрыт или проголосовал, потому что я не могу решить эту проблему самостоятельно и мне нужна помощь профессиональных программистов.
Итак, всем известны такие приложения, как Facebook, Twitter или Gmail.В каждом из этих приложений мы используем списки.Я думаю, что эти списки основаны на Recyclerview
с библиотекой подкачки.Я хотел бы создать подобный список в моем приложении, но я не знаю, как я могу это сделать.
Что у меня сейчас есть:
- Библиотека дооснащения - для получения данных с сервера через API (каждый фрагмент данных содержит 50 элементов)
- RecyclerView с пользовательским адаптером
- Прослушиватель прокрутки, который используется для получения новых данных, когда список достигает дна или вершины recyclerView.
Мой метод воссоздает recyclerView с новыми данными, и это выглядит не очень хорошо.У меня есть несколько решений для создания бесконечного списка:
Оставайтесь с текущим решением, основанным на scrollListener:
msgLst.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
val visibleItemCount = mLayoutManager.childCount
val totalItemCount = mLayoutManager.itemCount
val pastVisibleItems = mLayoutManager.findFirstVisibleItemPosition()
if (loading) {
if (visibleItemCount + pastVisibleItems >= totalItemCount /*&& !recyclerView.canScrollVertically(1)*/) {
if (nextUrl != null) {
if (sp.getLong("expires_in", 0) - sp.getLong("time_delta", 0) - System.currentTimeMillis() / 1000 <= 60) {
error["message"] = "access_token_expired"
error["request_no"] = "7"
Singleton.workingWithErrors(error, context!!)
} else {
getMessages(type, Integer.parseInt(Uri.parse(nextUrl).getQueryParameter("offset")), true)
}
}
}
}
if (dy >= 30) {
loading = true
}
if (dy < 0) {
if (loading) {
if (mLayoutManager.findFirstVisibleItemPosition() - mLayoutManager.childCount <= 0 /*&& !recyclerView.canScrollVertically(-1)*/) {
loading = false
if (prevUrl != null) {
if (sp.getLong("expires_in", 0) - sp.getLong("time_delta", 0) - System.currentTimeMillis() / 1000 <= 60) {
error["message"] = "access_token_expired"
error["request_no"] = "7"
Singleton.workingWithErrors(error, context!!)
} else {
Singleton.m_offset = Integer.valueOf(Uri.parse(prevUrl).getQueryParameter("offset"))
getMessages(type, Integer.parseInt(Uri.parse(prevUrl).getQueryParameter("offset")), true)
}
}
}
}
}
super.onScrolled(recyclerView, dx, dy)
}
})
это решение отправитьновый запрос с новым смещением:
Integer.parseInt(Uri.parse(prevUrl).getQueryParameter("offset")
он может отправить запрос сверху и снизу, но это решение недостаточно хорошо.
Другое решение - пейджинговая библиотека от Google.Как я понял, мне придется использовать:
PageKeyedDataSource
, но я не могу понять, как использовать его вместо моего текущего варианта.Я видел множество решений с бесконечным списком, но ничего не мог сделать, кроме создания класса, расширяющего PageKeyedDataSource, а затем я не знал, что делать. Еще одно решение, основанное на scrollListener - динамическое добавлениеданные к адаптеру.Это означает, что я отправлю новый набор данных в адаптер, а затем добавлю новые элементы после последнего элемента recyclerView.Но я также вижу, что этот метод также перерисовывает переработчик с видимыми эффектами.Возможно, я что-то сделал неправильно.
Прямо сейчас после вызова API я получаю arrayList и отправляю его на свой адаптер:
val messageArrayList = response.body()!!.messages
adapter = MessageListAdapter((messageArrayList as ArrayList<MessageModel>), context!!, type)
adapter.notifyDataSetChanged()
msgLst.adapter = adapter
Итак, для получения данных со страницы "«Я должен передать следующий / предыдущий номер смещения, полученный из ответа.Итак, как я могу использовать pagingAdapter или другое решение, которое поможет мне сделать бесконечный список вместо того, что у меня есть сейчас.
PS Я могу опубликовать свой адаптер, если это будет важно для правильного ответа.