滑动回收站视图项目时,如何禁用拉动刷新?

时间:2019-03-17 07:04:13

标签: android android-recyclerview recyclerview-layout itemtouchhelper

我在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);

3 个答案:

答案 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
相关问题