一种选择是编辑您的LayoutManager
. 这里的想法是找到最后一个可见项目的位置。如果该位置等于数据集的最后一项,则应触发重新加载。
@Override
public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
final int result = super.scrollVerticallyBy(dy, recycler, state);
if (findLastVisibleItemPosition() == mData.length - 1) {
loadMoreData();
}
return result;
}
@Override
public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
super.onLayoutChildren(recycler, state);
if (findLastVisibleItemPosition() == mData.length - 1) {
loadMoreData();
}
}
或者,您可以通过适配器的onBindViewHolder
方法执行此操作,尽管这无疑有点“黑客”:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (position == mData.length - 1) {
// load more data here.
}
/// binding logic
}
第三个选项是将 OnScrollListener 添加到 RecyclerView。@velval 在此页面上的回答很好地解释了这一点。
无论您选择哪个选项,您还应该包含代码以防止数据加载逻辑触发太多次(例如,在先前获取更多数据的请求完成并返回新数据之前)。