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