如何在滑动RecyclerView项时禁用下拉刷新?

3

我正在使用SwipeRefreshLayout嵌套RecyclerView,当我开始滑动以删除我的RecyclerView项时,它会触发下拉刷新。我想要在开始滑动时禁用下拉刷新,并在完成滑动时启用它。我使用了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);

android-studio 标签仅适用于寻求 IDE 本身帮助的问题,不适用于 Android 编程。 - letsintegreat
抱歉,我不知道那个..谢谢。 - Nimantha
3个回答

6
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
您可以在onMove方法中禁用刷新布局。
swiperefreshLayout.setEnabled(false);

然后在onSwiped方法中启用它

swiperefreshLayout.setEnabled(true);

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) {

            }
        });
    }
         

使用此代码,只有在recycler view处于起始位置时才启用“下拉刷新”,因此它无法向上滚动更多。 然后您会在其中启用刷新布局的recycler view上获得一个“片段”,在这种情况下,该片段为recyclerview.height / 0x4。
因此,只有当您触摸recycler view的顶部并向下滚动时,刷新才会开始,如果您已经滚动了recycler view并到达了顶部并且仍然向上滚动,则不会启动滑动(这是我遇到的问题)。
我尝试了上面的解决方案,但仍然存在同样的问题:如果我开始向下滚动列表,然后向上滚动到顶部以上,则仍会启动下拉刷新。
希望这对您有所帮助, 祝您编码愉快,拥有美好的一天:D
再见!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接