【Android 事件分发】ItemTouchHelper 实现侧滑删除(二)

简介: 【Android 事件分发】ItemTouchHelper 实现侧滑删除(二)

4、滑动速度判定设置


重写 ItemTouchHelper.Callback 的 getSwipeEscapeVelocity 方法 , 设置用户的滑动判定速度 , 单位是每秒移动的像素个数 , 达到该速度后 , 才可以被判定为滑动 ;


public class Callback extends ItemTouchHelper.Callback {
    /**
     * 滑动判定速度, 每秒移动的像素个数, 达到该速度后, 才可以被判定为滑动
     * @param defaultValue
     * @return
     */
    @Override
    public float getSwipeEscapeVelocity(float defaultValue) {
        return 5f;
    }
}


侧滑判定 : 这里有两种侧滑判定条件 , 满足任意一个即可触发侧滑删除 ;

① 条件一 : getSwipeThreshold 方法中设置的滑动距离 , 滑动超过 0.5 滑动幅度 , 触发侧滑删除 ;

② 条件二 : getSwipeEscapeVelocity 方法中设置的滑动速度 , 水平方向上每秒超过 5 像素的速度 , 触发侧滑删除 ;



5、设置动画时间


重写 ItemTouchHelper.Callback 的 getAnimationDuration 方法 , 设置用户的手指离开后的动画持续时间 , 单位 毫秒 ms ;


public class Callback extends ItemTouchHelper.Callback {
    /**
     * 手指离开后的动画持续时间
     * @param recyclerView
     * @param animationType
     * @param animateDx
     * @param animateDy
     * @return
     */
    @Override
    public long getAnimationDuration(@NonNull RecyclerView recyclerView,
                                     int animationType,
                                     float animateDx, float animateDy) {
        return 200L;
    }
}



6、设置侧滑删除触发操作


重写 ItemTouchHelper.Callback 的 onSwiped 方法 , 用户侧滑判定成功后 , 会调用该方法 , 如果侧滑判定不成功 , 则不会调用该方法 ;


侧滑判定 : 这里有两种侧滑判定条件 , 满足任意一个即可触发侧滑删除 ;

① 条件一 : getSwipeThreshold 方法中设置的滑动距离 , 滑动超过 0.5 滑动幅度 , 触发侧滑删除 ;

② 条件二 : getSwipeEscapeVelocity 方法中设置的滑动速度 , 水平方向上每秒超过 5 像素的速度 , 触发侧滑删除 ;

可以只设置一个 , 也可以都设置 ;



public class Callback extends ItemTouchHelper.Callback {
    /**
     * 滑动时的回调操作
     * @param viewHolder
     * @param direction
     */
    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        Log.i(TAG, "触发侧滑删除条目");
        // 滑动指定的距离, 达到一定幅度后, 就会触发该方法回调
        // 这里做的是滑动删除功能, 直接删除滑动项
        // 该方法中删除指定条目, 并刷新界面
        mAdapter.deleteItem(viewHolder.getAdapterPosition());
    }
}



7、RecyclerView.Adapter 适配器中的删除操作


删除数据列表中的元素 , 并调用 notifyItemRemoved 触发删除动画 ;


 

public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
        /**
         * 删除元素调用的方法
         * @param position
         */
        public void deleteItem(int position) {
            names.remove(position);
            notifyItemRemoved(position);
        }
  }






三、完整代码实现



1、主界面


package kim.hsl.recyclerview;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
    /**
     * 数据源
     */
    private ArrayList<String> names = new ArrayList<String>();
    /**
     * 当前的 RecyclerView 列表
     */
    private RecyclerView recycler_view;
    /**
     * 布局管理器
     */
    private LinearLayoutManager layoutManager;
    /**
     * 适配器
     */
    private Adapter adapter;
    /**
     * 添加拖动处理
     */
    private ItemTouchHelper mItemTouchHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 初始化数据
        initData();
        //1 . 从布局中获取 RecyclerView
        recycler_view = findViewById(R.id.recycler_view);
        //2 . 创建并设置布局管理器
        //创建布局管理器
        layoutManager = new LinearLayoutManager(
                this,
                RecyclerView.VERTICAL,
                false);
        //设置布局管理器
        recycler_view.setLayoutManager(layoutManager);
        // 设置边距
        recycler_view.addItemDecoration(new ItemDecoration());
        //3 . 创建并设置列表适配器
        adapter = new Adapter();
        recycler_view.setAdapter(adapter);
        //4. 添加拖动事件
        Callback callback = new Callback(adapter);
        mItemTouchHelper = new ItemTouchHelper(callback);
        mItemTouchHelper.attachToRecyclerView(recycler_view);
    }
    /**
     * 初始化数据
     */
    private void initData(){
        names.add("宋江");
        names.add("卢俊义");
        names.add("吴用");
        names.add("公孙胜");
        names.add("关胜");
        names.add("林冲");
        names.add("秦明");
        names.add("呼延灼");
        names.add("花荣");
        names.add("柴进");
        names.add("李应");
        names.add("朱仝");
        names.add("鲁智深");
        names.add("武松");
        names.add("董平");
        names.add("张清");
        names.add("杨志");
        names.add("徐宁");
        names.add("索超");
    }
    /**
     * RecyclerView 适配器
     */
    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
        private RecyclerView mRecyclerView;
        @Override
        public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
            this.mRecyclerView = recyclerView;
        }
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View root_view = LayoutInflater.from(MainActivity.this)
                    .inflate(R.layout.item_recyclerview, parent, false);
            return new ViewHolder(root_view);
        }
        @Override
        public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
            holder.text.setText("" + names.get(position));
        }
        @Override
        public int getItemCount() {
            return names.size();
        }
        public class ViewHolder extends RecyclerView.ViewHolder {
            TextView text;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                text = itemView.findViewById(R.id.text);
            }
        }
        /**
         * 删除元素调用的方法
         * @param position
         */
        public void deleteItem(int position) {
            names.remove(position);
            notifyItemRemoved(position);
        }
    }
}



目录
相关文章
|
6天前
|
Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
9天前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
Android面试高频知识点(1) 图解 Android 事件分发机制
23 1
|
14天前
|
XML 前端开发 Android开发
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
Android面试高频知识点(1) 图解Android事件分发机制
|
22天前
|
Android开发
Android 事件分发机制详细解读
Android 事件分发机制详细解读
35 4
|
3月前
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
3月前
|
Android开发
Android面试高频知识点(1) 图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。
166 9
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
Android项目架构设计问题之组件A通知组件B某个事件的发生如何解决
39 0
|
4月前
|
Android开发
Android使用DrawerLayout仿qq6.6版本侧滑效果
Android使用DrawerLayout仿qq6.6版本侧滑效果
31 0
|
5月前
|
Android开发
39. 【Android教程】触摸事件分发
39. 【Android教程】触摸事件分发
42 2
|
5月前
|
XML Android开发 数据格式
37. 【Android教程】基于监听的事件处理机制
37. 【Android教程】基于监听的事件处理机制
76 2