Android RecycleView如何实现Item拖拽效果
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的
千家信息网最后更新 2025年02月08日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安全错误
数据库的锁怎样保障安全
数据库修改表属性
在广西租服务器选哪家idc商
义乌java软件开发工程师
kvm用于企业级服务器虚拟化
服务器2008安装包
服务器日志删除
网络安全重大案例
警察打击网络安全
软件开发项目质量功能偏差
哪种软件开发模型没有灵活性
jquery 操作数据库
设计数据库用哪个软件
《计算机网络安全》
数据库单价用什么字符
FIREBUG下载软件开发
现有网络技术和电商的发展
社会网络安全网
php输出数据库图片乱码
网络安全技术app下载
深圳小马互联网医疗科技有限公司
软件开发工具的发展过程
思迅数据库修改商品信息
西山区方便软件开发网上价格
辽阳地区服务器
ip数据网络技术基础ppt
java 数据库实例分析题
苏州阿里云服务器站点
戴尔塔式服务器t130
电信主dns服务器通信
单机开发数据库