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拖拽效果就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
推荐阅读
-
android(如何快速开发框架 小米note开发版MIUI,安卓6.0,怎么安装Xposed框架)
稳定版,你必须先根除。你上网搜索安卓可以叫别人s框架,对方可以把框架做成jar包,把这个jar包加载到项目目录的libs文件中使...
-
android(studio 虚拟机启动不了 android studio可以当模拟器用吗)
androidstudio可以当模拟器用吗?AmdCUP引导模拟器有点复杂。雷电模拟器上的抖音怎么登录不上?不是,闪电模拟调用...
-
从实践中学习手机抓包与数据分析(android 手机抓包app)
android手机抓包app?netcapture抓包精灵app(手机抓包工具)又名sslcapture,是什么专业的安卓手机抓...
-
android(studio全局搜索 android studio怎么看app界面)
androidstudio怎么看app界面?在设备桌面点击运用直接进入到App界面,就也可以参与其他你的操作了。android-...
-
怎么把android框架源代码拉到本地(android studio如何运行别人的源代码)
androidstudio如何运行别人的源代码?androidstudio点击刚建在列表中你选择导入module,导入即可在用...
-
android(studio2022年使用教程 怎么安装Android studio详细教程)
怎么安装Androidstudio详细教程?androidstudio中haxm直接安装的方法追加:1、简单的方法打开Andr...
-
怎么使用Android基准配置文件Baseline Profile方案提升启动速度
-
HTML5如何实现禁止android视频另存为
-
php 将数组中键为驼峰的转为下划线连接
上一篇中,将数组中以下划线连接的键转为驼峰,本篇记录将数组中键为驼峰的转为下划线连接方法如下://数组中键为驼峰的转下划线...
-
学java好还是学php好?