gpt4 book ai didi

android - RecyclerView.OnScrollListener : being called multiple times for once instance of scroll

转载 作者:太空狗 更新时间:2023-10-29 13:50:08 26 4
gpt4 key购买 nike

我有一个水平布局的 recyclerview,一次只能看到一个 View :

mRecyclerView = findViewById(R.id.rvmain);
mRecyclerView.setOnFlingListener(null);
final SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(mRecyclerView);
mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MainActivityRVAdapter(postsModels,MainActivity.this);
mRecyclerView.setAdapter(mAdapter);

使用 onScrolllistener,每次滚动我都想知道开始位置和结束位置。我正在使用以下代码:

    @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);


if(count == 0) {
View centerView = snapHelper.findSnapView(mLayoutManager);
if(centerView != null){
initial_position = mLayoutManager.getPosition(centerView);
//initial_position2 = ((LinearLayoutManager)mRecyclerView.getLayoutManager()).findFirstVisibleItemPosition();
Log.e("Initial Item Position:",""+initial_position);
//Log.e("Initial Item Position2:",""+initial_position2);
}
count ++;
}



// get newstate position
if(newState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
View centerView = snapHelper.findSnapView(mLayoutManager);
if(centerView != null){
int pos = mLayoutManager.getPosition(centerView);

count = 0; // in idle state clear the count again
Log.e("Snapped Item Position:",""+pos);
}
}


}

我得到的结果是:

E/Initial Item Position:: 0
E/Snapped Item Position:: 1
E/Initial Item Position:: 1
E/Snapped Item Position:: 1
E/Initial Item Position:: 1
E/Snapped Item Position:: 1
E/Initial Item Position:: 1
E/Snapped Item Position:: 1

它会多次返回位置。我想检查最终位置和初始位置之间的差异。我只想要开始和结束,以便我可以比较和检查即:

E/Initial Item Position:: 0 and

E/Snapped Item Position:: 1

最佳答案

我遇到了同样的问题。我发现了什么:RecyclerView.OnScrollListener 调用 onScrolled(...)SCROLL_STATE_DRAGGING 中多次或 SCROLL_STATE_SETTLING .

我开始听第二个回调:
onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState)
我们对最终状态很感兴趣SCROLL_STATE_IDLE .

所以在这种情况下,我们必须覆盖 onScrollStateChanged(...),检查并忽略除 SCROLL_STATE_IDLE 之外的所有状态,并在空闲时获得最终位置。

但如docs中所述, onScrolled(...)

will also be called if visible item range changes after a layout calculation. In that case, dx and dy will be 0.

在实践中我发现如果我们调用 adapter.notifyDataSetChanged() 并且可见位置是“0”(即在第一次启动时),onScrollStateChanged( ...) 不会被调用,onScrolled(...) 将被调用一次,dx == dy == 0

最终的变体如下:

private int recyclerVisiblePosition;    
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);

if (newState != RecyclerView.SCROLL_STATE_IDLE) {
return;
}

getNewPosition(recyclerView);
}

@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);

if (dx == 0 && dy == 0) {
getNewPosition(recyclerView);
}
}

private void getNewPosition(@NonNull final RecyclerView recyclerView) {
final LinearLayoutManager layoutManager = ((LinearLayoutManager)recyclerView.getLayoutManager());
if (layoutManager != null) {
recyclerVisiblePosition = layoutManager.findLastVisibleItemPosition();
}
}

关于android - RecyclerView.OnScrollListener : being called multiple times for once instance of scroll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49151476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com