如何在具有潜在大数据源的 RecyclerView 中实现分页机制?

How to implement a paging mechanism into a RecyclerView with a potentially big data source?

我正在寻找一种在我的 RecyclerView 列表中实施分页机制的好方法。我正在使用 AsyncTaskLoader 将数据填充并缓存到 RecyclerView.

public class HeadlinesListLoader extends AsyncTaskLoader<List<Headline>> {

    public HeadlinesListLoader(Context context) {
        super(context);
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public List<Headline> loadInBackground() {
        return DataManager.getInstance().findAllHealines();
    }

    @Override
    public void deliverResult(List<Headline> data) {
        super.deliverResult(data);
    }
} 

其中 DataManager.getInstance().findAllHealines(); 进行 RESTful 调用以检索列表数据,但是,它当前正在加载所有数据一次,这可能需要很长时间。

我一直在寻找一种有效的方法来根据需要逐渐将数据加载到 RecyclerView 中。我遇到了 Android 推荐的这个分页库:

https://developer.android.com/topic/libraries/architecture/paging.html

但是,它在前端查询数据库的方式在我的案例中听起来不像是正确的解决方案,而且由于我使用的是 AsyncTaskLoader,我想知道是否有办法解决这个问题使用 Loaders 框架本身?或者什么是更好的选择?

我愿意接受任何建议。谢谢。

您可以在滚动事件上执行此操作。

YourListElement.addOnScrollListener(new RecyclerView.OnScrollListener() {
        boolean isSlidingToLast = false;
        int lastVisibleItemPosition = 0;
        int lastPositions = 0;

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            if (newState == RecyclerView.SCROLL_STATE_IDLE && linearLayoutManager.getItemCount() > 0) {
                lastPositions = linearLayoutManager.getItemCount();
                lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition();

                if (lastPositions - 1 == lastVisibleItemPosition && isSlidingToLast) {
                    loadData(false);
                }
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            isSlidingToLast = dy > 0;
        }
    });

加载数据是获取新数据填充的函数