在 Android 开发中,RecyclerView 是常用的列表控件。而 Material Design 是 Google 推出的设计语言,它的设计风格简洁大方,深受开发者喜爱。在 Material Design 中,侧滑删除是一种常见的交互模式。本文将介绍如何在 Material Design 下实现 RecyclerView 的侧滑删除功能。
侧滑删除的实现原理
侧滑删除的实现原理是通过在 RecyclerView 中添加一个 ItemTouchHelper.Callback 回调类,然后在该类中处理各种手势事件,实现侧滑删除的效果。
ItemTouchHelper.Callback 回调类中主要包含以下几个方法:
- onMove():当用户拖动一个 ItemView 时被调用,可以用来实现拖动排序等功能。
- onSwiped():当用户滑动一个 ItemView 时被调用,可以用来实现侧滑删除等功能。
- getMovementFlags():用来设置支持的拖动和滑动的方向。
- isLongPressDragEnabled():是否支持长按拖动。
- isItemViewSwipeEnabled():是否支持滑动删除。
在本文中,我们只需要实现 onSwiped() 方法即可。
实现步骤
1. 添加依赖
在 build.gradle 文件中添加以下依赖:
implementation 'androidx.recyclerview:recyclerview:1.1.0'
2. 创建 RecyclerView
在布局文件中添加 RecyclerView 控件:
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />
3. 创建适配器
创建 RecyclerView 的适配器,继承自 RecyclerView.Adapter,其中 VH 是 ViewHolder 的泛型。在 onCreateViewHolder() 方法中创建 ViewHolder,并将其与布局文件绑定:
// javascriptcn.com 代码示例 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.textView.setText("Item " + position); } @Override public int getItemCount() { return 50; } }
4. 创建 ItemTouchHelper.Callback 回调类
创建一个 ItemTouchHelper.Callback 类,继承自 ItemTouchHelper.Callback,实现 onSwiped() 方法:
// javascriptcn.com 代码示例 public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback { private MyAdapter mAdapter; public MyItemTouchHelperCallback(MyAdapter adapter) { mAdapter = adapter; } @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(0, swipeFlags); } @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); mAdapter.removeItem(position); } }
其中,getMovementFlags() 方法用来设置支持的滑动方向,这里设置为左右滑动。isItemViewSwipeEnabled() 方法用来开启滑动删除功能。onSwiped() 方法中,我们获取被滑动的 ItemView 的位置,然后通过适配器的 removeItem() 方法将其删除。
5. 绑定 ItemTouchHelper
在 Activity 或 Fragment 中,创建 RecyclerView 和适配器,并将其绑定。然后创建一个 ItemTouchHelper 实例,并将其与 RecyclerView 绑定:
RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(); recyclerView.setAdapter(adapter); MyItemTouchHelperCallback callback = new MyItemTouchHelperCallback(adapter); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(recyclerView);
至此,我们已经完成了 RecyclerView 的侧滑删除功能的实现。
示例代码
完整的示例代码如下:
activity_main.xml
<androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />
item_layout.xml
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="16dp" android:textSize="18sp" android:textStyle="bold" />
MyAdapter.java
// javascriptcn.com 代码示例 public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { class ViewHolder extends RecyclerView.ViewHolder { TextView textView; ViewHolder(View itemView) { super(itemView); textView = itemView.findViewById(R.id.textView); } } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.textView.setText("Item " + position); } @Override public int getItemCount() { return 50; } public void removeItem(int position) { notifyItemRemoved(position); } }
MyItemTouchHelperCallback.java
// javascriptcn.com 代码示例 public class MyItemTouchHelperCallback extends ItemTouchHelper.Callback { private MyAdapter mAdapter; public MyItemTouchHelperCallback(MyAdapter adapter) { mAdapter = adapter; } @Override public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; return makeMovementFlags(0, swipeFlags); } @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { int position = viewHolder.getAdapterPosition(); mAdapter.removeItem(position); } }
MainActivity.java
// javascriptcn.com 代码示例 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerView); MyAdapter adapter = new MyAdapter(); recyclerView.setAdapter(adapter); MyItemTouchHelperCallback callback = new MyItemTouchHelperCallback(adapter); ItemTouchHelper itemTouchHelper = new ItemTouchHelper(callback); itemTouchHelper.attachToRecyclerView(recyclerView); } }
总结
本文介绍了在 Material Design 下实现 RecyclerView 的侧滑删除功能的方法,通过添加 ItemTouchHelper.Callback 回调类,并实现其中的 onSwiped() 方法,即可实现侧滑删除。同时,本文也提供了完整的示例代码,希望能够对大家有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/655e3e6fd2f5e1655d883400