Android 正在调用两次RecyclerView无限滚动侦听器
我有一个Android 正在调用两次RecyclerView无限滚动侦听器,android,android-recyclerview,Android,Android Recyclerview,我有一个RecyclerView,我正试图在其中实现无限滚动功能。问题是,OnScrolled方法中if语句中的代码被执行了两次。这是我目前的代码: public abstract class InfiniteScroll extends RecyclerView.OnScrollListener { private LinearLayoutManager mLayoutManager; private int previousTotal = 0; private boolean loadin
RecyclerView
,我正试图在其中实现无限滚动功能。问题是,OnScrolled
方法中if语句中的代码被执行了两次。这是我目前的代码:
public abstract class InfiniteScroll extends RecyclerView.OnScrollListener {
private LinearLayoutManager mLayoutManager;
private int previousTotal = 0;
private boolean loading = true;
private int visibleThreshold = 5;
int firstVisibleItem, visibleItemCount, totalItemCount;
private int current_page = 1;
public InfiniteScroll(LinearLayoutManager layoutManager) {
mLayoutManager = layoutManager;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading && (totalItemCount - visibleItemCount)
<= (firstVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
current_page++;
Log.d("moreitems", "why is this being called twice?");
loadMore(current_page);
loading = true;
}
}
public abstract void loadMore(int current_page);
}
公共抽象类InfiniteScroll扩展了RecyclerView.OnScrollListener{
私人直线酒店经理;
private int previousTotal=0;
私有布尔加载=真;
私有int visibleThreshold=5;
int firstVisibleItem、visibleItemCount、totalItemCount;
私有int当前页面=1;
公共无限滚动(LinearLayoutManager布局管理器){
mLayoutManager=布局经理;
}
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
visibleItemCount=recyclerView.getChildCount();
totalItemCount=mLayoutManager.getItemCount();
firstVisibleItem=mLayoutManager.findFirstVisibleItemPosition();
如果(装载){
如果(totalItemCount>previousTotal){
加载=假;
previousTotal=totalItemCount;
}
}
如果(!loading&&(totalItemCount-visibleItemCount)
试试这个:
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
loading = true;
// End has been reached
// Do something
current_page++;
Log.d("moreitems", "why is this being called twice?");
loadMore(current_page);
}
}
public void onScrolled(RecyclerView-RecyclerView,int-dx,int-dy){
super.onScrolled(recyclerView、dx、dy);
最终LinearLayoutManager LinearLayoutManager=(LinearLayoutManager)recyclerView.getLayoutManager();
totalItemCount=linearLayoutManager.getItemCount();
lastVisibleItem=linearLayoutManager.findLastVisibleItemPosition();
如果(!loading&&totalItemCount会调用它,因为当您加载更多项目时,会再次调用onScrolled
如果在布局计算后可见项范围发生更改,也将调用此回调。在这种情况下,dx和dy将为0
所以你可以检查一下
if(!load&&dy>0)
同样我刚刚遇到了类似的情况,而解决方案与上面的答案大不相同
在我的例子中,我有一个自定义的RecycleServicewFragment,它将在数据加载开始时设置RecyclerView。我在设置方法块中添加了一个自定义OnScrollListener
我两次调用OnScrollListener的原因是,我不小心在我的RecyclerView中添加了两个OnScrollListener。因此,这两个监听器都将监听器添加到“滚动到结尾”操作中,并为此做些事情
因此,在调用setup方法之前,我只是删除了RecyclerView的所有OnScrollListener,以确保只有一个OnScrollListener
希望这有帮助
if (layoutManager.findLastCompletelyVisibleItemPosition() ==
recyclerAdapter.getItemCount() - 1) {
//load more items code is here
}
这将起作用。使用LimearLayoutManager#findLast[完全]VisibleItemPosition()
method使用此解决方案,您在哪里将加载设置回false
?否则加载保持为true
,并且再次到达列表末尾不会触发另一次加载。我在这里发布了一个示例代码:Add loading=false;在loarmore()方法中(最后一行)。您应该在完成所有内容后将加载设置为false。顺便说一句,我已将其添加到“已加载”
的开头,因此不会执行任何操作,是否有理由将其与“加载”
一起使用?我看到它可以与“加载”一起使用!但为什么要在代码之间执行,可以吗?我将其向上移动,如:如果(dy