RecyclerView系列我们已经实现了自定义分割线,还有自定义时间轴效果,它的强大功能可不止于此!今天又是玩转Recycler的一天,就来实现RecyclerView的侧滑删除和拖动排序效果。
介绍
ItemTouchHelper,它是一个可以给RecyclerView提供添加拖动排序与滑动删除等等操作的工具类。RecyclerView的Item操作,离不开这个强大的工具类,话不多说,一起来看看怎么使用吧!
用法
第一步:创建接口:IOperationData
功能:接口中定义两个实现方法:一个用来处理RecyclerView中多个Item的移动排序事件;一个用来处理Item的左滑删除事件。
/**
* @data on 2020/11/13 5:49 PM
* @auther armStrong
* @describe ItemTouchHelper用法(RecyclerView拖拽、删除)
*/publicinterfaceIOperationData{/**
* 数据交换
* @param fromPosition
* @param toPosition
*/voidonItemMove(intfromPosition,inttoPosition);/**
* 数据删除
* @param position
*/voidonItemDissmiss(intposition);}
第二步:创建回调类:IHCallback
功能:需要继承ItemTouchHelper.Callback方法,重写Item的众多操作事件:滑动、按压弹起、移动。实现排序布局+滑动删除的主要类。
/**
* @data on 2020/11/13 6:07 PM
* @auther armStrong
* @describe ItemTouchHelper用法(RecyclerView拖拽、删除)
*/publicclassIHCallbackextendsItemTouchHelper.Callback{privateMoveAdaptermoveAdapter;publicIHCallback(MoveAdaptermoveAdapter){this.moveAdapter=moveAdapter;}@OverridepublicintgetMovementFlags(@NonNullRecyclerViewrecyclerView,@NonNullRecyclerView.ViewHolderviewHolder){//允许上下的拖动intdragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN;//只允许从右向左侧滑intswipeFlags=ItemTouchHelper.LEFT;returnmakeMovementFlags(dragFlags,swipeFlags);}@OverridepublicbooleanonMove(@NonNullRecyclerViewrecyclerView,@NonNullRecyclerView.ViewHolderviewHolder,@NonNullRecyclerView.ViewHoldertarget){moveAdapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());returntrue;}@OverridepublicvoidonSwiped(@NonNullRecyclerView.ViewHolderviewHolder,inti){moveAdapter.onItemDissmiss(viewHolder.getAdapterPosition());//调用我们自定义的方法}@OverridepublicvoidonChildDraw(Canvasc,RecyclerViewrecyclerView,RecyclerView.ViewHolderviewHolder,floatdX,floatdY,intactionState,booleanisCurrentlyActive){super.onChildDraw(c,recyclerView,viewHolder,dX,dY,actionState,isCurrentlyActive);if(actionState==ItemTouchHelper.ACTION_STATE_SWIPE){//滑动时改变Item的透明度finalfloatalpha=1-Math.abs(dX)/(float)viewHolder.itemView.getWidth();viewHolder.itemView.setAlpha(alpha);}}}
第三步:创建Adapter类:MoveAdapter
功能:填充数据,并且实现接口中定义的两个方法:Item移动排序+滑动删除
/**
* @data on 2020/11/13 5:55 PM
* @auther armStrong
* @describe ItemTouchHelper用法(RecyclerView拖拽、删除)
*/publicclassMoveAdapterextendsRecyclerView.AdapterimplementsIOperationData{privateListmDataList;privateLayoutInflatermInflater;privateContextmContext;publicMoveAdapter(Contextcontext){this.mContext=context;mInflater=LayoutInflater.from(mContext);}MoveAdapter(ListdataList){mDataList=dataList;}publicvoidsetData(ListdataList){mDataList=dataList;notifyDataSetChanged();}@OverridepublicMoveHolderonCreateViewHolder(ViewGroupparent,intviewType){returnnewMoveHolder(mInflater.inflate(R.layout.item_move,parent,false));}@OverridepublicvoidonBindViewHolder(MoveHolderholder,intposition){holder.mTextTitle.setText(mDataList.get(position));}@OverridepublicintgetItemCount(){returnmDataList==null?0:mDataList.size();}@OverridepublicvoidonItemMove(intfromPosition,inttoPosition){//交换位置Collections.swap(mDataList,fromPosition,toPosition);notifyItemMoved(fromPosition,toPosition);}@OverridepublicvoidonItemDissmiss(intposition){//移除数据mDataList.remove(position);notifyItemRemoved(position);}staticclassMoveHolderextendsRecyclerView.ViewHolder{TextViewmTextTitle;MoveHolder(ViewitemView){super(itemView);mTextTitle=itemView.findViewById(R.id.tv_move);}}}
第四步:布局文件
主布局:简单写一个TitleBar和一个RecyclerView
子布局:RecyclerView的item布局,简单写一个TextView
第五步:在Activity中书写业务逻辑代码
publicclassCase64extends AppCompatActivity{privateMoveAdapteradapter;privateLinearLayoutManagerlayoutManager;privateRecyclerViewrecycler;privateListitemList;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_case64);initView();initData();initRecycler();}privatevoidinitView(){recycler=findViewById(R.id.recycler64);}privatevoidinitData(){itemList=newArrayList<>();itemList.add("hahhhha");itemList.add("aaaaaaa");itemList.add("bbbbbbb");itemList.add("cccccc");itemList.add("ddddd");itemList.add("hahhhha");itemList.add("aaaaaaa");itemList.add("bbbbbbb");itemList.add("cccccc");itemList.add("ddddd");}privatevoidinitRecycler(){//瀑布流布局adapter=newMoveAdapter(this);layoutManager=newLinearLayoutManager(this);layoutManager.setOrientation(RecyclerView.VERTICAL);recycler.setLayoutManager(layoutManager);recycler.setAdapter(adapter);adapter.setData(itemList);//拖拽、删除ItemTouchHelperitemTouchHelper=newItemTouchHelper(newIHCallback(adapter));itemTouchHelper.attachToRecyclerView(recycler);//装饰recycler.setItemAnimator(newDefaultItemAnimator());recycler.addItemDecoration(newDividerItemDecoration(this));//item分割线recycler.addItemDecoration(newTimeLineItemDecoration(this));//时间轴效果}}
如果你想了解我的RecyclerView分割线,以及时间轴的自定义效果,不妨关注我的Android控件使用安利篇,偷偷告诉你,里面还有很多有趣控件哦!
此外,提供传送门送你直达:(本篇使用到的分割线+时间轴效果)
===>>>TimeLineItemDecoration():RecyclerView之实现滚动时间轴效果
大功告成!