Как использовать библиотеку подкачки вместо обычного адаптера и утилиты просмотра? - PullRequest
0 голосов
/ 21 мая 2019

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

Итак, всем известны такие приложения, как Facebook, Twitter или Gmail.В каждом из этих приложений мы используем списки.Я думаю, что эти списки основаны на Recyclerview с библиотекой подкачки.Я хотел бы создать подобный список в моем приложении, но я не знаю, как я могу это сделать.

Что у меня сейчас есть:

  1. Библиотека дооснащения - для получения данных с сервера через API (каждый фрагмент данных содержит 50 элементов)
  2. RecyclerView с пользовательским адаптером
  3. Прослушиватель прокрутки, который используется для получения новых данных, когда список достигает дна или вершины recyclerView.

Мой метод воссоздает recyclerView с новыми данными, и это выглядит не очень хорошо.У меня есть несколько решений для создания бесконечного списка:

  1. Оставайтесь с текущим решением, основанным на 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 Я могу опубликовать свой адаптер, если это будет важно для правильного ответа.

1 Ответ

1 голос
/ 21 мая 2019

Я думаю, что лучший способ сделать нумерацию страниц с представлением recycle - использовать EndlessScrollListener с вашим представлением recycle. Вы можете найти пример кода по ссылкам ниже.

Пример один

Пример два

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...