我在SwipeRefreshLayout内部使用了一个recyclerview,当我开始滑动以删除我的recycler视图项目时,它将主动拉动以刷新。我想在开始滑动时禁用拉动刷新,并启用完整的滑动。我使用ItemTouchHelper类来检测滑动动作
这是我的.xml文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeRefreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
然后,这个Java文件
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
}).attachToRecyclerView(recyclerView);
答案 0 :(得分:1)
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
super.onSelectedChanged(viewHolder, actionState);
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
swiperefreshLayout.setEnabled(false);
} else {
swiperefreshLayout.setEnabled(true);
}
}
}
答案 1 :(得分:1)
我个人是这样做的:
protected void initRecyclerViewOnItemTouchListener(){
mRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_UP || (((LinearLayoutManager) mRecyclerView.getLayoutManager()).findFirstCompletelyVisibleItemPosition() == 0x0 &&
e.getY() - mRecyclerView.getY() <= mRecyclerView.getHeight() / 0x4)) {
msrlReload.setEnabled(true);
} else {
msrlReload.setEnabled(false);
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
}
使用此代码,只有在回收站视图位于其开始位置时才启用“刷新刷新”,因此无法向上滚动。 然后,您有一个启用了刷新布局的回收站视图的“切片”,在这种情况下,此切片为recyclerview.height / 0x4。
因此,仅当您触摸回收器视图的顶部并向下滚动时,刷新才会开始;如果您已经在滚动回收器视图并且到达顶部,但仍向上滚动,则滑动不会开始(这是我遇到的问题)。
我尝试了上面的解决方案,但仍然存在相同的问题:如果我开始向下滚动列表,然后向上滚动至顶部并超出滑动范围以刷新仍然开始。
我希望这对您有帮助, 编码不错,每天:D
再见!
答案 2 :(得分:0)
您可以通过location / {
index index.html index.php;
}
方法禁用刷新布局
onMove
然后以swiperefreshLayout.setEnabled(false);
方法启用它
onSwiped