当屏幕上没有足够的项目时,无尽的回收者查看scoll监听器

时间:2016-10-25 15:41:28

标签: android android-recyclerview

我实现了this以使用我的回收站视图进行inifinte滚动。 我这样设置:

mRecyclerView.addOnScrollListener(new EndlessRecyclerViewScrollListener(glm) {
        @Override
        public void onLoadMore(int page, int totalItemsCount) {
            anotherOne(page, mScope, mCurrentSortPreference, false);
            Log.v(LOG_TAG, "onloadmore called");
        }
    });

方法anotherOne()从具有异步任务的API加载回收器视图中的数据。 如果我从API中获取了20多个项目(在初始调用中),它可以正常工作。这是因为我的网格允许同时在屏幕上显示最多20个结果。

但是如果api返回的项目很少(比如2或3)而不是只显示那些项目,那么onLoadMore()会被重复调用,直到它用相同的2或3项填充屏幕。然后就停止了。

Schreenshot

这是我在EndlessRecyclerViewScrollListener.java中修改的唯一一行:

private int visibleThreshold = 1;

谢谢。

E:添加了代码

private void anotherOne(int currPage, int scope, String sort, boolean o){ 
    String override = Boolean.valueOf(o).toString();
    (new FetchMoviesTask()).execute(Integer.valueOf(currPage).toString(),
            Integer.valueOf(scope).toString(), sort, override, "");
}

3 个答案:

答案 0 :(得分:1)

来自源文档:

  

//低于当前滚动位置的最小项目数

     

//在加载更多之前。

     

private int visibleThreshold = 5;

这意味着它必须至少有visibleThreshold个未显示的内容,以便安全无法收集更多数据......所以您要求:

private int visibleThreshold = 1;

这意味着您的数据集必须具有"全屏加上visibleThreshold",因为您没有更多数据,它假设您这样做,请求错误的偏移,并重复获取最后一个数据,直到您拥有"全屏加上visibleThreshold"数据单位。

降低Treshold,或在false上返回onLoadMore

编辑:

再次从文档中,请尝试以下操作:

@Override
      public boolean onLoadMore(int page, int totalItemsCount) {
          // Triggered only when new data needs to be appended to the list
          // Add whatever code is needed to append new items to your AdapterView
          loadNextDataFromApi(totalItemsCount); 
          return true; // ONLY if more data is actually being loaded; false otherwise.
      }

public void loadNextDataFromApi(int offset) {
  // Send an API request to retrieve appropriate paginated data 
  //  --> Send the request including an offset value (i.e `page`) as a query parameter.
  //  --> Deserialize and construct new model objects from the API response
  //  --> Append the new data objects to the existing set of items inside the array of items
  //  --> Notify the adapter of the new items made with `notifyDataSetChanged()`
}

答案 1 :(得分:1)

在我的情况下,我忘记添加行。希望它对某人有帮助。 recyclerView.addOnScrollListener(scrollListener);

答案 2 :(得分:0)

如果在EndlessRecyclerViewScrollListener的onScrolled()方法中设置断点,您将知道原因。如果屏幕上没有足够的项目,则recyclerView将自动滚动并调用onScrolled方法。由于没有足够的项目来占据屏幕,因此lastVisibleItemPosition +阈值将始终大于totalNumberOfItems。结果,将重复调用onLoadMore方法。