Kotlin - проблема в разбиении на страницы Recyclerview - PullRequest
0 голосов
/ 28 февраля 2020

Я использую метод ниже, чтобы проверить, достигнуто ли Recyclerview снизу вверх или нет ... последняя позиция в Recyclerview видна или нет:

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {

        override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
            super.onScrollStateChanged(recyclerView, newState)
        }

        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            if (dy > 0) {
                visibleItemCount = recyclerView.getLayoutManager()!!.getChildCount()
                totalItemCount = recyclerView.getLayoutManager()!!.getItemCount()
                pastVisiblesItems =
                    (recyclerView.getLayoutManager() as GridLayoutManager).findFirstVisibleItemPosition()

                if (visibleItemCount + pastVisiblesItems >= totalItemCount && isLoadMore) {
                    // mocking network delay for API call
                    apiCall()
                }
            }
        }
    })

Проблема apiCall() вызывает twise или thrise когда-то, когда я прокручиваю Recyclerview внизу .

Вы можете видеть, что я управляю булевой переменной isLoadMore

Здесь я Прохождение 1. Страница, 2. Ограничение при звонке на мой веб-сервис.

по умолчанию страница равна 1, а ограничение равно 20. В следующий раз будет 2 (страница) и 20 (ограничение).

Итак, выборка 20 данных для каждого вызова веб-службы.

Теперь, если в ответ я обнаружил, что размер новых данных меньше моего предела, я делаю для isLoadMore значение false.

В чем может быть проблема? Не могли бы вы помочь мне решить эту проблему. Как я могу точно знать, что это время, когда нужно обратиться в службу поддержки, когда просмотрщик завершает свою работу.

Спасибо.

Ответы [ 3 ]

1 голос
/ 28 февраля 2020

Существует специальная библиотека, которая предоставляет нумерацию страниц в recyclerView. Проверьте Библиотека подкачки . Вам нужно будет ввести PageKeyedDataSource<Int, Item>(), где вы можете позвонить своему apiCall(). Существует замечательное учебное пособие для реализации вызовов дооснащения с библиотекой подкачки

1 голос
/ 28 февраля 2020

Добавить isLoading логическое значение, которое указывает на apiCall() в процессе.

Ex)

override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            if (dy > 0) {
                visibleItemCount = recyclerView.getLayoutManager()!!.getChildCount()
                totalItemCount = recyclerView.getLayoutManager()!!.getItemCount()
                pastVisiblesItems =
                    (recyclerView.getLayoutManager() as GridLayoutManager).findFirstVisibleItemPosition()

                if (!isLoading && visibleItemCount + pastVisiblesItems >= totalItemCount && isLoadMore) {
                    // mocking network delay for API call
                    isLoading = true
                    apiCall()
                }
            }
        }

fun apiCall() {
    ...
    //when finished api request such as onResponse, onFailure function
    isLoading = false
}
0 голосов
/ 28 февраля 2020

Наконец, я сделал, как показано ниже:

Взял переменную:

private var isScrolling = true

Внутри, OnScrollStateChanged:

  override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
  super.onScrollStateChanged(recyclerView, newState)
  if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
         isScrolling = true
     }
  }

Проверено, в onScrolled:

override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            if (dy > 0) {
                visibleItemCount = recyclerView.getLayoutManager()!!.getChildCount()
                totalItemCount = recyclerView.getLayoutManager()!!.getItemCount()
                pastVisiblesItems =
                    (recyclerView.getLayoutManager() as GridLayoutManager).findFirstVisibleItemPosition()

                if (isScrolling && visibleItemCount + pastVisiblesItems >= totalItemCount && isLoadMore) {
                    isScrolling = false
                    // mocking network delay for API call
                   apiCall()
                }
            }
        }
...