Android Studio初学笔记-Day17-ItemTouchHelper

ItemTouchHelper

接续昨天的RecyclerView,今天来让RecyclerView的功能变得更完善,今天要讲的是ItemTouchHelper。ItemTouchHelper可以让使用者和在RecyclerView的资料互动,今天要来做的是移动资料和实现左滑删除的功能,话不多说,首先最基本的RecyclerView和昨天相同,包括引用套件和设定Adapter,这里我就不多做讲解,有需要的可以参考前一篇。直接在昨天的MainActivity中加入以下函数。

程序码

private void recyclerViewAction(RecyclerView recyclerView, 
                                final ArrayList<String> choose,final MyAdapter adapter){
    ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
        @Override
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull 
                                             RecyclerView.ViewHolder viewHolder) {
            //加入需要移动的方向,有分dragFlags和swipeFlags
         return makeMovementFlags(ItemTouchHelper.UP | ItemTouchHelper.DOWN , 
                                  ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
        }
           
        @Override
        //对资料移动作设定
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull 
            RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
            int position_dragged = viewHolder.getAdapterPosition();       //选取的位置
            int position_target = target.getAdapterPosition();            //放置的位置
            //交换阵列中两资料位置,choose为阵列
            Collections.swap(choose,position_dragged,position_target);  
            //告知配适器资料有更换
            adapter.notifyItemMoved(position_dragged,position_target);  
            return false;
        }

        @Override
        //对滑动做功能设定
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();
            switch(direction){
                case ItemTouchHelper.LEFT:                  //资料左滑
                case ItemTouchHelper.RIGHT:
                     choose.remove(position);               //移除资料
                     adapter.notifyItemRemoved(position);   //告知配适器资料有更换
                     if(position!=choose.size()){
                     //开始改变的位置和总共被影响的位置数量,相当重要否则资料的position不会更改
                     //刮号内是(改变的位置,受影响的数量)
                         adapter.notifyItemRangeChanged(position,choose.size()-position);  
                     }
                     break;
            }
        }
            @Override
            //如果希望加上图片则需要以下
            public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView, 
               @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, 
               boolean isCurrentlyActive) {
                  new RecyclerViewSwipeDecorator.Builder(c,recyclerView,viewHolder,dX,dY 
                                                          ,actionState,isCurrentlyActive)
                        //设定图的背景颜色,也可使用getResourses.getColor(id)
                        .addBackgroundColor(ContextCompat.getColor(MainActivity.this,
                                            android.R.color.holo_red_dark))    
                        //设定图片
                        .addActionIcon(R.drawable.ic_baseline_delete_24)
                        .create()
                        .decorate();
                //拖曳状态下不做改变需要呼叫父类别的方法
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, 
                                  isCurrentlyActive);
            }
        });
        helper.attachToRecyclerView(recyclerView);                //绑上recyclerView
    }
}
  • 其中包括各种手势,包括左滑、上移,可以依自己所需增加变更,以及设定各手势的功能有区分为Move和Swipe,其中这两个在更新资料时都需要告知adapter资料有移除或着移动,其中有比较重要的程序麻烦注意一下,不然在之後可是会有严重的bug的。

成果

https://ithelp.ithome.com.tw/upload/images/20210908/20139136GI0bXYhepS.png
今天ItemTouchHelper就讲到这边,谢谢大家~/images/emoticon/emoticon41.gif


<<:  第六章 之四

>>:  【18】GlobalAveragePooling 与 Flatten 的差异与比较

[DAY 01]天啊我为什麽要建这chatbot

前言 FF14是一款热门MMORPG类型游戏,近几个月人气甚至打败昔日的MMO霸主魔兽世界 目前主线...

视觉化当日趋势图(4)-controller撰写

我们昨天撰写完serviceImpl还缺少一个interface, 所以今天把ShioajiServ...

找LeetCode上简单的题目来撑过30天啦(DAY28)

题号:73 标题:Set Matrix Zeroes 难度:Medium Given an m x ...

【课程推荐】2021/3/6~3/7、3/13~3/14 软件架构师技能培训班

课程目标 了解软件架构师所应具备的技能与素养,分析与规划软件架构模型,撰写符合国际标准的SAD (S...

【Day24-序列】时间序列型资料的基本处理——以0050股票价格为例:寻找峰值、移动平均、曲线拟合

前面我们虽然有讲到除了基本的数值类型资料以外,一共主要会有文字、图片、声音这三大类型,而在数值类型的...