亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

使用RecylerView完成拖動排序高仿qq側滑刪除功能

2019-12-12 05:02:54
字體:
來源:轉載
供稿:網友

 最近使用到Recylerview完成拖動排序,側滑刪除,在此記錄一下。

需要使用到:ItemTouchHelper.Callback這個類。

效果圖:

在有RecylerView的Activity中,除了設置Adapter還需要做的事情有:

MyItemTouchHelperCallback callback = new MyItemTouchHelperCallback(adapter); //此類繼承ItemTouchHelper.Callback,這是幫助處理RecylerView拖動側滑操作的輔助類 ItemTouchHelper helper = new ItemTouchHelper(callback); //用上面實例化的callback實例化一個ItemTouchHelper對象。套路代碼,沒啥好說的,固定做法 helper.attachToRecyclerView(recyclerView); //讓help幫助處理recylerview的滑動,側滑操作

Activity中的操作就這么簡單。

接下來定義一個接口,這個接口是為了解除耦合,因為我看到有一些文章在activity中處理了onMove和onSwipe,抽象出來更好理解。

public interface OnMoveAndSwipeListener { public boolean onItemMove(int fromPosition, int toPosition); //注意返回boolean哦 public void onItemDismiss(int position); }

在RecylerView的Adapter中實現此接口,

復寫上面的兩個方法,

@Override public boolean onItemMove(int fromPosition, int toPosition) { if (fromPosition < toPosition) { //往下移動時,做數據交換 for (int i = fromPosition; i < toPosition; i++) { Collections.swap(list,i,i+1); } }else{ //往上移動,做數據交換 for (int i = fromPosition; i >toPosition ; i--) { Collections.swap(list,i,i-1); } } notifyItemMoved(fromPosition,toPosition); return true; } @Override public void onItemDismiss(int position) { //此例沒有對側滑做操作,如果需要就在此模仿onItemMove方法,刪除對應位置的數據,并且刷新界面就可以了 }

這樣Adapter的工作也就完成了,一樣也很簡單,都有固定的套路,注意大家看到的demo都是有個默認的動畫,這個動畫效果是你在設置RecylerView時,recylerview.setItemAnimator(參數);設置進去的,如果你沒有調用此方法,則就是默認動畫效果。

除了設置Adapter還需要做的事情有:

寫一個類繼承ItemTouchHelper.Callback,這就是最后一步了,也是本文最開始在Activity中實例化的類,

代碼也不多:

public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback { MyAdapter adapter; public MyItemTouchHelperCallback(MyAdapter adapter) { this.adapter = adapter; } @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //復寫此方法用來設置我需要處理哪些操作 //我要處理上下拖動,就設置up down,如果是gridview類型的recylerview,up,down,left,right都可以處理 final int moveMode = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //本例沒有處理側滑,如果需要處理側滑,就把注釋取消掉 //final int swipeMode = ItemTouchHelper.START | ItemTouchHelper.END; Log.e("getMovementFlags","getMovementFlags"); return makeMovementFlags(moveMode, 0);//不處理什么,就傳0 } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { //當你拖動時就會觸發此回調,然后調用在adapter中復寫的onItemMove方法,去交換數據 return adapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition()); } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { //如果你要處理側滑就取消注釋,邏輯和上面的onMove一樣 // adapter.onItemDismiss(viewHolder.getAdapterPosition()); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { //此方法在你選中一個item拖動時觸發,所以你可以在這里給選中的item設置一個背景色,用于高亮提示你選中了這個背景色 super.onSelectedChanged(viewHolder, actionState); if (actionState!= ItemTouchHelper.ACTION_STATE_IDLE){ viewHolder.itemView.setBackgroundColor(Color.LTGRAY); } } @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //因為你設置了背景色,所以在你不選中的時候,要取消掉這個背景色。 super.clearView(recyclerView, viewHolder); viewHolder.itemView.setBackgroundColor(0); } }

到此為止,一個簡單的拖動和側滑就完成了,其實拖動和側滑的邏輯都是一樣的,按著上面的步驟來,效果就出來了。

上面只是一個簡單的效果。把上面的效果實現了,接下來看更進階一點的效果:

RecycleViewSwipeDismiss

要做到上述的效果,先說一下上面的邏輯:

首先他的每個Item的布局是兩層:

<?xml version="1.0" encoding="utf-8"?> <!--背景view,用于提示用戶操作結果--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/rl_background" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/iv_done" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="16dp" android:layout_marginStart="16dp" android:src="@mipmap/bt_ic_done_white_24" /> <ImageView android:id="@+id/iv_schedule" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginEnd="16dp" android:layout_marginRight="16dp" android:src="@mipmap/bt_ic_schedule_white_24" /> <!--滑動操作的view--> <LinearLayout android:id="@+id/ll_item" android:layout_width="match_parent" android:layout_height="64dp" android:background="@android:color/white" android:gravity="center_vertical" android:orientation="vertical" android:paddingLeft="16dp" android:paddingRight="16dp"> <TextView android:id="@+id/tv_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" tools:text="Item" /> </LinearLayout> <View android:layout_width="match_parent" android:layout_height="1dp" android:layout_below="@id/ll_item" android:background="#B2B2b2" /> </RelativeLayout>

原理:全屏的linearlayout負責側滑效果,而根布局是有顏色有圖片的那一層,因為linearlayout被滑走了,所以根布局以及上面的圖片就出來了。

需要在MyItemTouchHelperCallback中重新復寫的幾個方法,以及多復寫的幾個方法:

<span style="white-space:pre"> </span> @Override public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { // 釋放View時回調,清除背景顏色,隱藏圖標 // 默認是操作ViewHolder的itemView,這里調用ItemTouchUIUtil的clearView方法傳入指定的view getDefaultUIUtil().clearView(((SampleAdapter.ItemViewHolder) viewHolder).vItem); ((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundColor(Color.TRANSPARENT); ((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.GONE); ((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.GONE); } @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) { // 當viewHolder的滑動或拖拽狀態改變時回調 if (viewHolder != null) { // 默認是操作ViewHolder的itemView,這里調用ItemTouchUIUtil的clearView方法傳入指定的view getDefaultUIUtil().onSelected(((SampleAdapter.ItemViewHolder) viewHolder).vItem); } } @Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { // ItemTouchHelper的onDraw方法會調用該方法,可以使用Canvas對象進行繪制,繪制的圖案會在RecyclerView的下方 // 默認是操作ViewHolder的itemView,這里調用ItemTouchUIUtil的clearView方法傳入指定的view getDefaultUIUtil().onDraw(c, recyclerView, ((SampleAdapter.ItemViewHolder) viewHolder).vItem, dX, dY, actionState, isCurrentlyActive); if (dX > 0) { // 向左滑動是的提示 ((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundResource(R.color.colorDone); ((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.VISIBLE); ((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.GONE); } if (dX < 0) { // 向右滑動時的提示 ((SampleAdapter.ItemViewHolder) viewHolder).vBackground.setBackgroundResource(R.color.colorSchedule); ((SampleAdapter.ItemViewHolder) viewHolder).ivSchedule.setVisibility(View.VISIBLE); ((SampleAdapter.ItemViewHolder) viewHolder).ivDone.setVisibility(View.GONE); } } @Override public void onChildDrawOver(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { // ItemTouchHelper的onDrawOver方法會調用該方法,可以使用Canvas對象進行繪制,繪制的圖案會在RecyclerView的上方 // 默認是操作ViewHolder的itemView,這里調用ItemTouchUIUtil的clearView方法傳入指定的view getDefaultUIUtil().onDrawOver(c, recyclerView, ((SampleAdapter.ItemViewHolder) viewHolder).vItem, dX, dY, actionState, isCurrentlyActive); } });

用getDefaultUIUtil()的方法指定滑動操作的是linearlayout,所以每次被滑走的只有linearlayout。其他的操作都是一樣的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品精品国产国产自在线| 亚洲欧洲黄色网| 成人午夜高潮视频| 久久久精品一区| 自拍偷拍亚洲欧美| 欧美一级视频免费在线观看| 亚洲视频在线观看| 色婷婷av一区二区三区在线观看| 亚洲欧美精品一区二区| www日韩中文字幕在线看| 欧美成人精品一区二区三区| 亚洲天堂精品在线| 亚洲美女中文字幕| 日韩av在线一区二区| 黑人巨大精品欧美一区免费视频| 欧美大片免费观看在线观看网站推荐| 欧美在线一区二区三区四| 国产成人精品免费久久久久| 日韩中文理论片| 亚洲18私人小影院| 日韩精品中文字幕有码专区| 日韩欧美在线国产| 在线观看国产精品淫| 亚洲国产精品久久久久久| 成人欧美在线观看| 久久天天躁狠狠躁夜夜躁| 久久久亚洲国产天美传媒修理工| 91亚洲va在线va天堂va国| 欧美性色视频在线| 国产精品视频播放| 亚洲视频综合网| 日韩精品欧美激情| 久久色在线播放| 亚洲精品国产精品久久清纯直播| 欧美精品在线视频观看| 亚洲欧美国产精品久久久久久久| 亚洲美女精品久久| 国产精品电影观看| 亚洲欧美一区二区三区久久| 亚洲国产精品久久久久久| 日韩电影中文字幕在线观看| 日韩av免费看| 精品国产乱码久久久久久虫虫漫画| 欧美性jizz18性欧美| 亚洲精品一区二区三区婷婷月| 亚洲2020天天堂在线观看| 一区二区三区国产在线观看| 日韩成人久久久| 国产成人一区二区三区小说| 欧亚精品在线观看| 日本精品免费一区二区三区| 久久全国免费视频| 日韩电影免费在线观看中文字幕| 国产成人综合精品| 在线亚洲国产精品网| 国产精品99一区| 5252色成人免费视频| 日韩欧美国产一区二区| 久久久99免费视频| 欧美在线视频一区| 在线观看欧美日韩国产| 日韩福利伦理影院免费| 亚洲男人天堂久| 亚洲天堂免费视频| 91精品国产综合久久香蕉| 亚洲一区二区在线播放| 久久久亚洲精品视频| 国产一区二区日韩精品欧美精品| 精品亚洲男同gayvideo网站| 国产啪精品视频| 中文在线资源观看视频网站免费不卡| 欧美精品手机在线| 在线观看免费高清视频97| 欧美极品少妇xxxxⅹ免费视频| 亚洲最大福利视频网| 国产精品99久久久久久人| 性色av一区二区三区免费| 国产精品久久久久久久久久三级| 日韩在线观看免费网站| 97欧美精品一区二区三区| 欧美精品videossex性护士| 国产精品video| 97国产精品视频人人做人人爱| 欧美性69xxxx肥| 国产精品久在线观看| 日韩视频在线一区| 日韩欧美精品在线观看| 欧美野外wwwxxx| 久久国产精彩视频| 26uuu另类亚洲欧美日本一| 国产精品99久久久久久久久| 亚洲精品免费av| 欧美一级片久久久久久久| 久久精品视频在线观看| 欧美黑人巨大xxx极品| 日本一区二三区好的精华液| 亚洲女人天堂视频| 亚州欧美日韩中文视频| 国产精品九九久久久久久久| 久久综合88中文色鬼| 欧美激情二区三区| 日产日韩在线亚洲欧美| 国产亚洲视频中文字幕视频| 欧美黄色片免费观看| 色综合久久88色综合天天看泰| 久久免费成人精品视频| 中文字幕免费国产精品| 自拍偷拍亚洲欧美| 日韩在线视频国产| 青草青草久热精品视频在线观看| 一本久久综合亚洲鲁鲁| 亚洲精品第一页| 欧洲午夜精品久久久| 国产91精品黑色丝袜高跟鞋| 欧美精品久久久久久久| 亚洲久久久久久久久久久| 国产一区二区三区在线看| 国产精品自产拍在线观看| 国产一区二区日韩精品欧美精品| 欧美最顶级的aⅴ艳星| 亚洲第一国产精品| 精品网站999www| 国产主播精品在线| 国产精品私拍pans大尺度在线| 成人黄色中文字幕| 中文字幕av一区中文字幕天堂| 欧美小视频在线观看| 欧美午夜无遮挡| 久久亚洲国产精品成人av秋霞| 亚洲人成77777在线观看网| 成人性教育视频在线观看| 国产精品免费小视频| 国产亚洲人成a一在线v站| 亚洲激情电影中文字幕| 88国产精品欧美一区二区三区| 精品国产区一区二区三区在线观看| 久久精视频免费在线久久完整在线看| 亚洲性视频网址| 97av在线影院| 97人人做人人爱| 欧美激情一二区| 欧美亚洲国产成人精品| 国产精品高潮在线| 日韩欧亚中文在线| 亚洲电影免费在线观看| 亚洲国产91精品在线观看| 国产美女精品视频免费观看| 日韩h在线观看| 精品日本高清在线播放| 日韩av快播网址| 国产精品久久久久久久久久久不卡| 精品福利视频导航| 国产精品∨欧美精品v日韩精品| 午夜精品久久久久久久久久久久| 欧美日韩福利电影| 尤物九九久久国产精品的分类| 亚洲欧洲日产国产网站| 日韩三级影视基地| 精品av在线播放| 永久555www成人免费| www日韩欧美| 8090理伦午夜在线电影| 亚洲欧洲日产国码av系列天堂| 久久久久女教师免费一区|