Android RecycleView如何实现Item拖拽效果

Android RecycleView如何实现Item拖拽效果

这篇文章将为大家详细讲解有关AndroidRecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

基于公司产品的优化需求,其中一个需求涉及到RecycleView的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效。我写了一个小Demo用作演示效果。

先看效果(只看效果,不看颜值)

步骤1、建接口文件ItemTouchHelperViewHolder,该接口文件中描述的是选中和放开当前Item调用的方法。

publicinterfaceItemTouchHelperViewHolder{voidonItemSelected();//选中itemvoidonItemCleared();//放开item}

步骤2、写Item得ViewHolder的类,该类需要继承RecyclerView.ViewHolder类,同时要实现步骤中的接口。

publicclassItemViewHolderextendsRecyclerView.ViewHolderimplementsItemTouchHelperViewHolder{privateTextViewtvName;publicTextViewgetTvName(){returntvName;}publicvoidsetTvName(TextViewtvName){this.tvName=tvName;}publicItemViewHolder(@NonNullViewitemView){super(itemView);tvName=itemView.findViewById(R.id.tv_item_name);}@OverridepublicvoidonItemSelected(){tvName.setBackgroundColor(Color.GRAY);}@OverridepublicvoidonItemCleared(){tvName.setBackgroundColor(Color.YELLOW);}}

步骤3、建立接口文件ItemTouchHelperAdapter,该文件中描写的是移动RecycleView的Item时会调用的方法。

publicinterfaceItemTouchHelperAdapter{voidonItemMove(intfromPosition,inttoPosition);}

步骤4、实现一个适配器,继承RecyclerView.Adapter<ItemViewHolder>,同时实现步骤3的接口。

publicclassRecyclerGridAdapterextendsRecyclerView.Adapter<ItemViewHolder>implementsItemTouchHelperAdapter{privateArrayList<String>localDataSet;privateSharedPreferencessp;privateSharedPreferences.EditorspEditor;finalstaticStringSAVE_KEY="star_sort";finalstaticStringUSER_PREFERENCE="user_preference";privateContextcontext;publicRecyclerGridAdapter(ArrayList<String>dataSet,Contextcontext){StringdefaultStr=dataSet.toString();if(context!=null){this.context=context;sp=context.getSharedPreferences(USER_PREFERENCE,Context.MODE_PRIVATE);spEditor=sp.edit();StringsaveString=sp.getString(SAVE_KEY,defaultStr);//考虑,若要更改数据源,需要怎么实现todoString[]splitStr=saveString.replace("[","").replace("]","").replace("","").split(",");localDataSet=newArrayList();localDataSet.addAll(Arrays.asList(splitStr));}}@NonNull@OverridepublicItemViewHolderonCreateViewHolder(@NonNullViewGroupparent,intviewType){Viewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view_holder_layout,parent,false);returnnewItemViewHolder(view);}@OverridepublicvoidonBindViewHolder(@NonNullItemViewHolderholder,intposition){holder.getTvName().setText(localDataSet.get(position));}@OverridepublicintgetItemCount(){returnlocalDataSet.size();}@OverridepublicvoidonItemMove(intfromPosition,inttoPosition){Stringprve=localDataSet.remove(fromPosition);if((toPosition>fromPosition)&&(localDataSet.size()<=toPosition)){//将当前item移至最后一位localDataSet.add(prve);}else{localDataSet.add(toPosition,prve);}notifyItemMoved(fromPosition,toPosition);spEditor.putString(SAVE_KEY,localDataSet.toString());spEditor.apply();}}

步骤5、实现ItemTouchHelper.Callback接口,至于什么是ItemTouchHelper,网上一查很多解释,我这不做阐述了。

publicclassSimpleItemTouchHelperCallbackextendsItemTouchHelper.Callback{privateItemTouchHelperAdapteradapter;publicSimpleItemTouchHelperCallback(ItemTouchHelperAdapteradapter){this.adapter=adapter;}@OverridepublicintgetMovementFlags(@NonNullRecyclerViewrecyclerView,@NonNullRecyclerView.ViewHolderviewHolder){finalintdragFlags=ItemTouchHelper.UP|ItemTouchHelper.DOWN|ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT;returnmakeFlag(ItemTouchHelper.ACTION_STATE_DRAG,dragFlags);}@OverridepublicbooleanonMove(@NonNullRecyclerViewrecyclerView,@NonNullRecyclerView.ViewHolderviewHolder,@NonNullRecyclerView.ViewHoldertarget){if(viewHolder.getItemViewType()!=target.getItemViewType()){returnfalse;}adapter.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());returntrue;}@OverridepublicvoidonSwiped(@NonNullRecyclerView.ViewHolderviewHolder,intdirection){}@OverridepublicvoidonSelectedChanged(@NullableRecyclerView.ViewHolderviewHolder,intactionState){if(actionState==ItemTouchHelper.ACTION_STATE_DRAG){ItemTouchHelperViewHolderitemTouchHelperViewHolder=(ItemTouchHelperViewHolder)viewHolder;itemTouchHelperViewHolder.onItemSelected();}super.onSelectedChanged(viewHolder,actionState);}@OverridepublicvoidclearView(@NonNullRecyclerViewrecyclerView,@NonNullRecyclerView.ViewHolderviewHolder){super.clearView(recyclerView,viewHolder);ItemViewHolderitemViewHolder=(ItemViewHolder)viewHolder;itemViewHolder.onItemCleared();}}

步骤6,现在就可以调用啦,基于步骤5实现的ItemToucherHelper.Callback实例构建ItemTouchHelper实例,然后attach给RecycleView就好啦。

classMainActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)valviewBinding=DataBindingUtil.setContentView<ActivityMainBinding>(this,R.layout.activity_main)with(viewBinding){vardata=ArrayList<String>()varindex=10while(index-->0){data.add(index.toString())}varadapter=RecyclerGridAdapter(data,this@MainActivity)recycleTest.layoutManager=GridLayoutManager(this@MainActivity,4)recycleTest.adapter=adaptervarcallback=SimpleItemTouchHelperCallback(adapter)varitemTouchHelper=ItemTouchHelper(callback)itemTouchHelper.attachToRecyclerView(recycleTest)}}}

关于AndroidRecycleView如何实现Item拖拽效果就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

发布于 2022-01-06 23:28:14
收藏
分享
海报
0 条评论
56
上一篇:C语言常见的文件操作函数有什么 下一篇:python简单批量梯度下降代码怎么写
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码