android item拖动排序,Recycler进阶之路:ItemTouchHelper实现Item的拖动排序+左滑删除效果...

RecyclerView系列我们已经实现了自定义分割线,还有自定义时间轴效果,它的强大功能可不止于此!今天又是玩转Recycler的一天,就来实现RecyclerView的侧滑删除和拖动排序效果。

587590283985

介绍

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之实现滚动时间轴效果

大功告成!

587590283985

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值