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); } } }