簡體   English   中英

如何禁用拉刷新,當刷卡回收器視圖項目?

[英]How to disable pull refresh, When swipe recycler view item?

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

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

swiperefreshLayout.setEnabled(false);

然后在onSwiped方法中啟用它

swiperefreshLayout.setEnabled(true);

我個人是這樣做的:

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

再見!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM