Android RecycleView如何实现Item拖拽效果
发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的
千家信息网最后更新 2025年11月09日Android RecycleView如何实现Item拖拽效果
这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
基于公司产品的优化需求,其中一个需求涉及到RecycleView的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效。我写了一个小Demo用作演示效果。
先看效果(只看效果,不看颜值)
步骤1、建接口文件ItemTouchHelperViewHolder,该接口文件中描述的是选中和放开当前Item调用的方法。
public interface ItemTouchHelperViewHolder { void onItemSelected(); //选中item void onItemCleared();//放开item}步骤2、写Item得ViewHolder的类,该类需要继承RecyclerView.ViewHolder类,同时要实现步骤中的接口。
public class ItemViewHolder extends RecyclerView.ViewHolder implements ItemTouchHelperViewHolder { private TextView tvName; public TextView getTvName() { return tvName; } public void setTvName(TextView tvName) { this.tvName = tvName; } public ItemViewHolder(@NonNull View itemView) { super(itemView); tvName = itemView.findViewById(R.id.tv_item_name); } @Override public void onItemSelected() { tvName.setBackgroundColor(Color.GRAY); } @Override public void onItemCleared() { tvName.setBackgroundColor(Color.YELLOW);}}步骤3、建立接口文件ItemTouchHelperAdapter,该文件中描写的是移动RecycleView的Item时会调用的方法。
public interface ItemTouchHelperAdapter { void onItemMove(int fromPosition,int toPosition);}步骤4、实现一个适配器,继承RecyclerView.Adapter
public class RecyclerGridAdapter extends RecyclerView.Adapterimplements ItemTouchHelperAdapter { private ArrayList localDataSet; private SharedPreferences sp; private SharedPreferences.Editor spEditor; final static String SAVE_KEY = "star_sort"; final static String USER_PREFERENCE = "user_preference"; private Context context; public RecyclerGridAdapter(ArrayList dataSet,Context context) { String defaultStr = dataSet.toString(); if(context != null){ this.context = context; sp = context.getSharedPreferences(USER_PREFERENCE,Context.MODE_PRIVATE); spEditor = sp.edit(); String saveString = sp.getString(SAVE_KEY,defaultStr); //考虑,若要更改数据源,需要怎么实现 todo String[] splitStr = saveString.replace("[","").replace("]","").replace(" ","").split(","); localDataSet = new ArrayList(); localDataSet.addAll(Arrays.asList(splitStr)); } } @NonNull @Override public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view_holder_layout, parent, false); return new ItemViewHolder(view); } @Override public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { holder.getTvName().setText(localDataSet.get(position)); } @Override public int getItemCount() { return localDataSet.size(); } @Override public void onItemMove(int fromPosition, int toPosition) { String prve = 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,网上一查很多解释,我这不做阐述了。
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback { private ItemTouchHelperAdapter adapter; public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) { this.adapter = adapter; } @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT; return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, dragFlags); } @Override public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { if (viewHolder.getItemViewType() != target.getItemViewType()) { return false; } adapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { } @Override public void onSelectedChanged(@Nullable RecyclerView.ViewHolder viewHolder, int actionState) { if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) { ItemTouchHelperViewHolder itemTouchHelperViewHolder = (ItemTouchHelperViewHolder) viewHolder; itemTouchHelperViewHolder.onItemSelected(); } super.onSelectedChanged(viewHolder, actionState); } @Override public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { super.clearView(recyclerView, viewHolder); ItemViewHolder itemViewHolder = (ItemViewHolder) viewHolder; itemViewHolder.onItemCleared(); }}步骤6,现在就可以调用啦,基于步骤5实现的ItemToucherHelper.Callback实例构建ItemTouchHelper实例,然后attach给RecycleView就好啦。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val viewBinding = DataBindingUtil.setContentView(this,R.layout.activity_main) with(viewBinding){ var data = ArrayList() var index = 10 while (index-- >0){ data.add(index.toString()) } var adapter = RecyclerGridAdapter(data,this@MainActivity) recycleTest.layoutManager = GridLayoutManager(this@MainActivity,4) recycleTest.adapter = adapter var callback = SimpleItemTouchHelperCallback(adapter) var itemTouchHelper = ItemTouchHelper(callback) itemTouchHelper.attachToRecyclerView(recycleTest) } }} 关于Android RecycleView如何实现Item拖拽效果就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
步骤
接口
效果
文件
偏好
内容
同时
实例
文章
方法
更多
用户
界面
知识
篇文章
需求
不错
有效
这不
产品
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
怎么上传代码到服务器
ipfs存储服务器怎么样
公安局网络安全总监
公司兼营软件开发即征即退
app软件开发方案模板
网络安全法看点解读
上古小说软件开发
列国志数据库app
照片调色最专业的软件开发
宝山区网络技术咨询技术指导
大数据引发网络安全问题数据
数据库的是
网易云上传云盘数据库错误
江苏精诚软件开发有限公司
远程控制数据库
江南大学网络安全邀请赛
我国网络安全问题有哪些
服务器raid卡介绍
上海hp服务器维修多少钱
西门子 软件开发工作
期待互联网科技logo
会plc还会写软件开发
中职计算机网络技术ppt
360软件属于网络安全软件
网络安全行业现状分析
沈阳尖峰软件开发电话
手机贵金属分析的软件开发
戴尔r410服务器光驱怎么用
数据库技术05
服务器下载东西走本地流量吗