滚动时加载 RecyclerView 元素
Loading RecyclerView elements upon overscroll
我在 SwipeRefreshLayout 中有一个 RecyclerView,因此在刷新 RecyclerView 时会重置。但是,一旦我到达 RecyclerView 的底部或过度滚动它,我想向其中添加更多项目。
我目前的尝试:
我已经将 RecyclerView 子类化,以便在到达底部时实现添加元素,如下所示(在 OnScrollListener 内部):
LinearLayoutManager manager = (LinearLayoutManager) getLayoutManager();
mVisible = manager.getChildCount();
mTotal = manager.getItemCount();
mPastVisible = manager.findFirstVisibleItemPosition();
if (!loading)
{
if (manager.findLastCompletelyVisibleItemPosition() ==
manager.getItemCount() - 1)
{
loading = true;
loadNext();
}
}
loadNext()
是一个异步请求,它在完成时将 loading
布尔值设置为 false 并像这样设置适配器:
MyAdapter adapter = new MyAdapter(items, ctx);
setAdapter(adapter);
scrollToPosition(mTotal - 1);
loading = false;
项目加载正确,但 scrollToPosition(mTotal - 1);
使最后一个项目成为最上面的第一个,而新的项目被添加到底部,而且由于进入的视图是动画的,有时旧视图保持绘制在 background/foreground 中,而新的则滑过它们。有没有更好的方法来实现它?
你可以试试这个:
private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleCount = manager.getChildCount();
int totalCount = manager.getItemCount();
int firstVisibleCount = manager.findFirstVisibleItemPosition();
if (loading && totalCount > previousTotalCount){
loading = false;
previousTotalCount = totalCount;
}
if (!loading && totalCount - visibleCount <= firstVisibleCount + 5){
loading = true;
loadNext();
}
}
};
而且您不需要调用 scrollToPosition()
我在 SwipeRefreshLayout 中有一个 RecyclerView,因此在刷新 RecyclerView 时会重置。但是,一旦我到达 RecyclerView 的底部或过度滚动它,我想向其中添加更多项目。
我目前的尝试:
我已经将 RecyclerView 子类化,以便在到达底部时实现添加元素,如下所示(在 OnScrollListener 内部):
LinearLayoutManager manager = (LinearLayoutManager) getLayoutManager();
mVisible = manager.getChildCount();
mTotal = manager.getItemCount();
mPastVisible = manager.findFirstVisibleItemPosition();
if (!loading)
{
if (manager.findLastCompletelyVisibleItemPosition() ==
manager.getItemCount() - 1)
{
loading = true;
loadNext();
}
}
loadNext()
是一个异步请求,它在完成时将 loading
布尔值设置为 false 并像这样设置适配器:
MyAdapter adapter = new MyAdapter(items, ctx);
setAdapter(adapter);
scrollToPosition(mTotal - 1);
loading = false;
项目加载正确,但 scrollToPosition(mTotal - 1);
使最后一个项目成为最上面的第一个,而新的项目被添加到底部,而且由于进入的视图是动画的,有时旧视图保持绘制在 background/foreground 中,而新的则滑过它们。有没有更好的方法来实现它?
你可以试试这个:
private RecyclerView.OnScrollListener scrollListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int visibleCount = manager.getChildCount();
int totalCount = manager.getItemCount();
int firstVisibleCount = manager.findFirstVisibleItemPosition();
if (loading && totalCount > previousTotalCount){
loading = false;
previousTotalCount = totalCount;
}
if (!loading && totalCount - visibleCount <= firstVisibleCount + 5){
loading = true;
loadNext();
}
}
};
而且您不需要调用 scrollToPosition()