DevBySimon-RecyclerView

SDRecyclerView:S-Swipe D-Drag  可側滑和拖拽 自帶刷新和加載的recyclerview

/*dependencies*/
dependencies {
    compile 'com.android.support:appcompat-v7:25.2.0'
    compile 'com.android.support:recyclerview-v7:25.2.0'
    compile 'com.android.support:design:25.2.0'
    compile 'com.android.support:cardview-v7:25.2.0'
    testCompile 'junit:junit:4.12'
}

/*佈局*/
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

     <android.support.v4.widget.SwipeRefreshLayout
         android:id="@+id/srl_layout"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
        <com.simon.recyclerview.SDRecyclerView
            android:id="@+id/smrv_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
     </android.support.v4.widget.SwipeRefreshLayout>
</android.support.design.widget.CoordinatorLayout>


/*代碼*/

/**
 * 刷新監聽
 */
private SwipeRefreshLayout.OnRefreshListener onRefreshListener = new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        mSDRecyclerView.postDelayed(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(false);
            }
        }, 2000);
    }
};
/**
 * 加載更多
 */
private RecyclerView.OnScrollListener mOnScrollListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        // TODO 手指不能向上滑動了
        if (!recyclerView.canScrollVertically(1)) {
            // TODO 這裏有個注意的地方,如果你剛進來時沒有數據,但是設置了適配器,這個時候就會觸發加載更多,需要開發者判斷下是否有數據,如果有數據纔去加載更多。

            Toast.makeText(MainActivity.this, "加載更多...", Toast.LENGTH_SHORT).show();
            initData();
            mMenuAdapter.notifyDataSetChanged();
        }
    }
};

/**
 * item單擊事件監聽。
 */
private OnItemClickListener onItemClickListener = new OnItemClickListener() {
    @Override
    public void onItemClick(int position) {
        Toast.makeText(mContext, "我是第" + position + "條。", Toast.LENGTH_SHORT).show();
    }
};

/**
 * 菜單創建器。在Item要創建菜單的時候調用。
 */
private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {
    @Override
    public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {
        int width = getResources().getDimensionPixelSize(R.dimen.item_height);
        // MATCH_PARENT 自適應高度,保持和內容一樣高;也可以指定菜單具體高度,也可以用WRAP_CONTENT。
        int height = ViewGroup.LayoutParams.MATCH_PARENT;
        // 添加左側的,如果不添加,則左側不會出現菜單。
        {
            SwipeMenuItem addItem = new SwipeMenuItem(mContext)
                    .setBackgroundDrawable(R.drawable.selector_green)// 點擊的背景。
                    .setImage(R.mipmap.ic_action_add) // 圖標。
                    .setWidth(width) // 寬度。
                    .setHeight(height); // 高度。
            //swipeLeftMenu.addMenuItem(addItem); // 添加一個按鈕到左側菜單。

            SwipeMenuItem closeItem = new SwipeMenuItem(mContext)
                    .setBackgroundDrawable(R.drawable.selector_red)
                    .setImage(R.mipmap.ic_action_close)
                    .setWidth(width)
                    .setHeight(height);

            //swipeLeftMenu.addMenuItem(closeItem); // 添加一個按鈕到左側菜單。
        }

        // 添加右側的,如果不添加,則右側不會出現菜單。
        {
            SwipeMenuItem deleteItem = new SwipeMenuItem(mContext)
                    .setBackgroundDrawable(R.drawable.selector_red)
                    .setImage(R.mipmap.ic_action_delete)
                    .setText("刪除") // 文字,還可以設置文字顏色,大小等。。
                    .setTextColor(Color.WHITE)
                    .setWidth(width)
                    .setHeight(height);
            swipeRightMenu.addMenuItem(deleteItem);// 添加一個按鈕到右側側菜單。

            SwipeMenuItem closeItem = new SwipeMenuItem(mContext)
                    .setBackgroundDrawable(R.drawable.selector_purple)
                    .setImage(R.mipmap.ic_action_close)
                    .setWidth(width)
                    .setHeight(height);
            swipeRightMenu.addMenuItem(closeItem); // 添加一個按鈕到右側菜單。

            SwipeMenuItem addItem = new SwipeMenuItem(mContext)
                    .setBackgroundDrawable(R.drawable.selector_green)
                    .setText("添加")
                    .setTextColor(Color.WHITE)
                    .setWidth(width)
                    .setHeight(height);
            swipeRightMenu.addMenuItem(addItem); // 添加一個按鈕到右側菜單。
        }
    }
};

/**
 * swipe菜單點擊監聽。
 */
private OnSwipeMenuItemClickListener menuItemClickListener = new OnSwipeMenuItemClickListener() {
    /**
     * Item的菜單被點擊的時候調用。
     * @param closeable       closeable. 用來關閉菜單。
     * @param adapterPosition adapterPosition. 這個菜單所在的item在Adapter中position。
     * @param menuPosition    menuPosition. 這個菜單的position。比如你爲某個Item創建了2個MenuItem,那麼這個position可能是是 0、1,
     * @param direction       如果是左側菜單,值是:SwipeMenuRecyclerView#LEFT_DIRECTION,如果是右側菜單,值是:SwipeMenuRecyclerView
     *                        #RIGHT_DIRECTION.
     */
    @Override
    public void onItemClick(Closeable closeable, int adapterPosition, int menuPosition, int direction) {
        closeable.smoothCloseMenu();// 關閉被點擊的菜單。

        if (direction == SDRecyclerView.RIGHT_DIRECTION) {
            // Toast.makeText(mContext, "list第" + adapterPosition + "; 右側菜單第" + menuPosition, Toast.LENGTH_SHORT).show();
        } else if (direction == SDRecyclerView.LEFT_DIRECTION) {
            // Toast.makeText(mContext, "list第" + adapterPosition + "; 左側菜單第" + menuPosition, Toast.LENGTH_SHORT).show();
        }

        // TODO 推薦調用Adapter.notifyItemRemoved(position),也可以Adapter.notifyDataSetChanged();
        if (menuPosition == 0) {
            // 刪除按鈕被點擊。
            mDataList.remove(adapterPosition);
            mMenuAdapter.notifyItemRemoved(adapterPosition);
        }
        if (menuPosition == 1) {
            Toast.makeText(mContext, "swipe菜單第二模塊", Toast.LENGTH_SHORT).show();
        }
        if (menuPosition == 2) {
            Toast.makeText(mContext, "swipe菜單第三模塊", Toast.LENGTH_SHORT).show();
        }

    }
};

/**
 * Item拖拽事件監聽
 */
private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {
    @Override
    public boolean onItemMove(int fromPosition, int toPosition) {
        // 當Item被拖拽的時候。
        Collections.swap(mDataList, fromPosition, toPosition);
        mMenuAdapter.notifyItemMoved(fromPosition, toPosition);
        return true;// 返回true表示處理了,返回false表示你沒有處理。
    }

    @Override
    public void onItemDismiss(int position) {
        // 當Item被滑動刪除掉的時候,在這裏是無效的,因爲這裏沒有啓用這個功能。
        // 使用Menu時就不用使用這個側滑刪除啦,兩個是衝突的。
    }
};
/**
 * Item的拖拽/側滑刪除時,手指狀態發生變化監聽。
 */
private OnItemStateChangedListener mOnItemStateChangedListener = new OnItemStateChangedListener() {
    @Override
    public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, @ActionStateMode int actionState) {
        if (actionState == OnItemStateChangedListener.ACTION_STATE_DRAG) {
            //"狀態:拖拽";
            // 拖拽的時候背景就透明瞭,這裏我們可以添加一個特殊背景。
            viewHolder.itemView.setBackgroundColor(ContextCompat.getColor(mContext, R.color.white_pressed));
        } else if (actionState == OnItemStateChangedListener.ACTION_STATE_SWIPE) {
            //"狀態:滑動刪除";
        } else if (actionState == OnItemStateChangedListener.ACTION_STATE_IDLE) {
            //"狀態:手指鬆開";
            // 在手鬆開的時候還原背景。
            ViewCompat.setBackground(viewHolder.itemView, ContextCompat.getDrawable(mContext, R.drawable.select_white));
        }
    }
};

//初始化recyclerview
private void initView() {
    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_layout);
    mSDRecyclerView = (SDRecyclerView) findViewById(smrv_view);

    mSwipeRefreshLayout.setOnRefreshListener(onRefreshListener);
    // 佈局管理器
    mSDRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    // 如果Item夠簡單,高度是確定的,打開FixSize將提高性能
    mSDRecyclerView.setHasFixedSize(true);
    // 設置Item默認動畫,加也行,不加也行
    mSDRecyclerView.setItemAnimator(new DefaultItemAnimator());
    // 添加分割線
    mSDRecyclerView.addItemDecoration(new ListViewDecoration());
    // 添加滾動監聽
    mSDRecyclerView.addOnScrollListener(mOnScrollListener);
    // 設置菜單創建器。
    mSDRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
    // 設置菜單Item點擊監聽。
    mSDRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);
    // 開啓拖拽
    mSDRecyclerView.setLongPressDragEnabled(true);
    // 監聽拖拽,更新UI。
    mSDRecyclerView.setOnItemMoveListener(onItemMoveListener);
    mSDRecyclerView.setOnItemStateChangedListener(mOnItemStateChangedListener);

    mMenuAdapter = new SDRecyclerAdapter(mDataList);
    mMenuAdapter.setOnItemClickListener(onItemClickListener);
    mSDRecyclerView.setAdapter(mMenuAdapter);
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章