打造最強RecyclerView側滑菜單,長按拖拽Item,滑動刪除Item

前幾天寫了一片關於RecyclerView滑動刪除Item,RecyclerView長按拖拽Item的博客,原本很簡單一個使用,閱讀量還挺高的,原博客傳送門java

今天介紹一個RecyclerView Item側滑菜單,RecyclerView滑動刪除Item,RecyclerView長按拖拽Item的開源項目,效果看下圖,你們也能夠下載演示apk具體操做體驗下SwipeRecyclerView的強大。android

須要說明的是,本庫沒有對RecyclerView作大的修改,只是ItemView的封裝。看起來是對RecyclerView的修改,其實僅僅是爲RecyclerView添加了使用的方法API而已。git

今天的博客將完美解決這些問題:github

  1. RecyclerView側滑菜單(左右兩側均可以添加)(List、Grid兩種形式)。微信

  2. RecyclerView長按拖拽Item(List、Grid兩種形式)。app

  3. RecyclerView側滑刪除item(List、Grid兩種形式)。框架

  4. 指定RecyclerView的某一個Item不能滑動刪除或長按拖拽(List、Grid兩種形式)。ide

  5. 根據Item的ViewType來決定顯示的菜單。佈局

  6. 用SwipeMenuLayout在任何地方均可以實現你本身的側滑菜單。spa

  7. 爲何沒有下拉刷新?看這裏的下拉刷新框架介紹

SwipeRecyclerView的源碼託管在Github:https://github.com/yanzhenjie...,歡迎Star。

若是不能打開Github,直接從CSDN上下載Demo


演示Demo apk下載

效果圖

若是網頁加載速度慢,能夠下載demo的apk看效果。

側滑菜單

RecyclerView Item側滑菜單。左右兩側均可以添加側滑菜單,菜單Item包括圖標、文字、點擊背景顏色等。也能夠根據Item的ViewType來決定某個Item的Menu的樣子、類型等:

雙向側滑根據ViewType顯示菜單

拖拽、側滑菜單

RecyclerView Item長按後拖拽Item移動位置。同時支持Item長按拖拽、Item側滑顯示菜單。包括各類佈局管理器,好比LinearLayoutManagerGridLayoutManager都完美支持:

Item拖拽和菜單結合Item拖拽和菜單結合

拖拽、側滑刪除

能夠指定某個Item不能被拖拽,指定某個Item不能被滑動刪除:

拖拽與滑動刪除拖拽與滑動刪除

引用方法

  • Eclipse 請自行下載源碼

  • AndroidStudio使用Gradle構建添加依賴(推薦)

compile 'com.yanzhenjie:recyclerview-swipe:1.0.0'

本庫引用的RecyclerView版本以下:

compile 'com.android.support:recyclerview-v7:23.4.0'

使用介紹

這裏列出關鍵實現,具體請參考demo,或者加我博客左側的交流羣或者關注個人公衆微信一塊兒來討論。

實現原理

  1. 側滑菜單使用自定義Layout實現,繼承自FragmeLayout。

  2. 長按拖拽Item、滑動Item刪除由ItemTouchHelper實現。

啓用SwipeReyclerView的長按Item拖拽功能和側滑刪除功能

recyclerView.setLongPressDragEnabled(true);// 開啓長按拖拽
recyclerView.setItemViewSwipeEnabled(true);// 開啓滑動刪除。
recyclerView.setOnItemMoveListener(onItemMoveListener);// 監聽拖拽和側滑刪除,更新UI。

...

 /**
 * 當Item移動的時候監聽。
 */
private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {
    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        // 當Item被拖拽的時候,交換Item的位置。
        Collections.swap(mStrings, fromPosition, toPosition);
        mMenuAdapter.notifyItemMoved(fromPosition, toPosition);
        return true;
    }

    @Override
    public void onItemDismiss(int position) {
        // 當Item被滑動刪除的時候,刪除Item。
        mStrings.remove(position);
        mMenuAdapter.notifyItemRemoved(position);
        Toast.show(mContext, "第" + position + "條被刪除。");
    }
};

添加Item側滑菜單

側滑菜單支持自動打開某個Item的菜單,並能夠指定是左邊仍是右邊的:

// 打開第一個Item的左側菜單。
recyclerView.openLeftMenu(0);

// 打開第一個Item的右側菜單。
recyclerView.openRightMenu(0);
  • 第一步,引用自定義View:SwipeMenuReyclerView:

<com.yanzhenjie.recyclerview.swipe.SwipeMenuRecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
  • 第二步,設置菜單建立器、菜單點擊監聽:

SwipeMenuRecyclerView swipeMenuRecyclerView = findViewById(R.id.recycler_view);
// 設置菜單建立器。
swipeMenuRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
// 設置菜單Item點擊監聽。
swipeMenuRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);
  • 第三步,菜單建立器建立菜單:

/**
 * 菜單建立器。在Item要建立菜單的時候調用。
 */
private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {
    @Override
    public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {

        SwipeMenuItem addItem = new SwipeMenuItem(mContext)
            .setBackgroundDrawable(R.drawable.selector_green)// 點擊的背景。
            .setImage(R.mipmap.ic_action_add) // 圖標。
            .setWidth(size) // 寬度。
            .setHeight(size); // 高度。
        swipeLeftMenu.addMenuItem(addItem); // 添加一個按鈕到左側菜單。

        SwipeMenuItem deleteItem = new SwipeMenuItem(mContext)
            .setBackgroundDrawable(R.drawable.selector_red)
            .setImage(R.mipmap.ic_action_delete) // 圖標。
            .setText("刪除") // 文字。
            .setTextColor(Color.WHITE) // 文字顏色。
            .setTextSize(16) // 文字大小。
            .setWidth(size)
            .setHeight(size);
        swipeRightMenu.addMenuItem(deleteItem);// 添加一個按鈕到右側側菜單。
    }
};
  • 第四步,繼承SwipeMenuAdapter,和正常的Adapter同樣使用:

public class MenuAdapter extends SwipeMenuAdapter<MenuAdapter.DefaultViewHolder> {

    @Override
    public int getItemCount() {
        return 0;
    }

    @Override
    public View onCreateContentView(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public ViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(MenuAdapter.DefaultViewHolder holder, int position) {
    }
}

就到這裏,更多的細節,請參考Github上的demo和源碼,源碼demo下載傳送門


版權聲明:本文轉自嚴振杰的專欄


歡迎加入個人技術交流羣:Android 愚公移山③ 547839514
歡迎關注個人公衆號,長期不斷推送優選博文、優秀開源項目,歡迎投稿:

嚴振杰的公衆號

相關文章
相關標籤/搜索