iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android RecycleView如何实现Item拖拽效果
  • 368
分享到

Android RecycleView如何实现Item拖拽效果

2023-06-26 03:06:08 368人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的优化需求,其中一个需求涉及到R

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

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

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

Android RecycleView如何实现Item拖拽效果

步骤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<ItemViewHolder>,同时实现步骤3的接口。

public class RecyclerGridAdapter extends RecyclerView.Adapter<ItemViewHolder> implements ItemTouchHelperAdapter {    private ArrayList<String> 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<String> 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<ActivityMainBinding>(this,R.layout.activity_main)        with(viewBinding){            var data = ArrayList<String>()            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拖拽效果就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Android RecycleView如何实现Item拖拽效果

本文链接: https://www.lsjlt.com/news/306542.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android RecycleView如何实现Item拖拽效果
    这篇文章将为大家详细讲解有关Android RecycleView如何实现Item拖拽效果,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于公司产品的优化需求,其中一个需求涉及到R...
    99+
    2023-06-26
  • Android如何使用RecycleView实现拖拽交换item位置
    小编这次要给大家分享的是Android如何使用RecycleView实现拖拽交换item位置,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。老规矩,先来一张效果图:相比起ListView而言,Recyc...
    99+
    2023-05-30
    recycleview android recycle
  • AndroidRecycleView实现Item拖拽效果
    基于公司产品的优化需求,其中一个需求涉及到RecycleView的拖拽,以及拖拽后item位置的持久化,目的是可以用户自定义界面偏好,并在用户下次进入本界面后,之前设置的偏好仍然有效...
    99+
    2024-04-02
  • 拖拽插件sortable.js如何实现el-table表格拖拽效果
    这篇文章将为大家详细讲解有关拖拽插件sortable.js如何实现el-table表格拖拽效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。问题描述Sortable.js是一款优秀的js拖拽库,因为是原生...
    99+
    2023-06-29
  • 如何使用JavaScript实现拖拽效果
    这篇文章主要介绍如何使用JavaScript实现拖拽效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!拖拽在前端开发中是很常见的功能,也是基本功之一,本文是不限制范围的拖拽也就是最简...
    99+
    2024-04-02
  • 如何用js实现一个拖拽效果
    这篇文章主要介绍“如何用js实现一个拖拽效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用js实现一个拖拽效果”文章能帮助大家解决问题。.markdown-body{word-break:br...
    99+
    2023-07-05
  • JavaScript如何实现九宫格拖拽效果
    这篇文章主要介绍“JavaScript如何实现九宫格拖拽效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript如何实现九宫格拖拽效果”文章能帮助大家解决问题。代码如下:<!DO...
    99+
    2023-07-02
  • JavaScript实现拖拽简单效果
    本文实例为大家分享了JavaScript实现拖拽效果的具体代码,供大家参考,具体内容如下 1.1 拖拽的基本效果 思路: 鼠标在盒子上按下时,准备移动 (事件加给物体) 鼠标移动时,...
    99+
    2024-04-02
  • vue实现拖拽排序效果
    本文实例为大家分享了vue实现拖拽排序效果的具体代码,供大家参考,具体内容如下 效果预览 组件 drag.vue <template>   <Transition...
    99+
    2024-04-02
  • JavaScript实现简单拖拽效果
    本文实例为大家分享了JavaScript实现简单拖拽效果的具体代码,供大家参考,具体内容如下 先看实现的效果: 思路:里面用到了三个事件,鼠标按下、移动、松开事件 那么首先创建盒子...
    99+
    2024-04-02
  • 原生JS如何实现圆环拖拽效果
    这篇文章给大家分享的是有关原生JS如何实现圆环拖拽效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。最近用原生JS写一个环形的鼠标滑动效果,代码如下:<!DOCTYPE&n...
    99+
    2024-04-02
  • js如何实现模态框的拖拽效果
    今天小编给大家分享一下js如何实现模态框的拖拽效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。分析思路:点击弹出层,模态框...
    99+
    2023-07-02
  • 拖拽插件sortable.js实现el-table表格拖拽效果
    目录问题描述案例一 简单拖拽代码附上案例二 el-table表格拖拽效果图代码附上问题描述 Sortable.js是一款优秀的js拖拽库,因为是原生js写的,所以性能不错,也支持移动...
    99+
    2024-04-02
  • vue实现弹窗拖拽效果
    本文实例为大家分享了vue实现弹窗拖拽效果的具体代码,供大家参考,具体内容如下 前言 实现拖拽其实简单来说就分为三步 一、创建一个js文件 因为本身dialog窗口不具备移动拖拽能力...
    99+
    2024-04-02
  • JavaScript实现鼠标拖拽效果
    本文实例为大家分享了JavaScript实现鼠标拖拽效果的具体代码,供大家参考,具体内容如下 这次的效果图如下: 我认为这个实验的难点是保持盒子和鼠标的相对位置不变,通过鼠标按下和...
    99+
    2024-04-02
  • Android 实现仿QQ拖拽气泡效果的示例
    目录效果图:一、实现思路二、功能实现三、全屏拖拽效果实现源码地址:效果图: 一、实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件...
    99+
    2024-04-02
  • JavaScript实现九宫格拖拽效果
    本文实例为大家分享了JavaScript实现九宫格拖拽效果的具体代码,供大家参考,具体内容如下 关于一些拼图游戏什么的,见人家效果做的不错,参考下别人写的代码,我也尝试着做了个。 &...
    99+
    2024-04-02
  • vue-draggable实现pc端拖拽效果
    本文实例为大家分享了vue-draggable实现pc端拖拽效果的具体代码,供大家参考,具体内容如下 为了实现下面这种布局可拖拽整合调整位置 拖拽前: 拖拽后: 一、安装 npm...
    99+
    2024-04-02
  • Javascript实现登录框拖拽效果
    本文实例为大家分享了Javascript实现登录框拖拽效果的具体代码,供大家参考,具体内容如下 需求分析 1、点击弹出登录框 2、在登录框的特定区域可以将登录框拖拽至任意位置 3...
    99+
    2024-04-02
  • JavaScript实现简单的拖拽效果
    本文实例为大家分享了JavaScript实现简单的拖拽效果的具体代码,供大家参考,具体内容如下 1.先搭架子: * { margin: 0; ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作