2

我在 SwipeRefreshLayout 中使用 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);
4

3 回答 3

5
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);
        }
    }
}
于 2019-10-01T16:19:17.090 回答
1

onMove您可以在方法中禁用刷新布局

swiperefreshLayout.setEnabled(false);

然后在onSwiped方法中启用它

swiperefreshLayout.setEnabled(true);
于 2019-03-17T07:55:02.757 回答
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

再见!

于 2020-08-26T08:50:04.433 回答