[英]Android - Swipe to delete RecyclerView
我正在尝试实现滑动以删除与 Gmail 应用程序“滑动到存档”相同的内容:
我尝试了很多教程,但没有一个像 gmail 一样快,我更喜欢不在外部库上工作。 我该怎么做?
编辑:
到目前为止我的代码-
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
// final int fromPos = viewHolder.getAdapterPosition();
// final int toPos = viewHolder.getAdapterPosition();
// // move item in `fromPos` to `toPos` in adapter.
return true;// true if moved, false otherwise
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//Remove swiped item from list and notify the RecyclerView
mAdapter.notifyItemRemoved(viewHolder.getLayoutPosition());
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(mRecyclerView);
我设法启用了滑动手势,但我不知道如何在 viewHolder 下添加背景和图像。 我试图将另一个 FrameLayout 放在 item_XXX.xml 文件中,但在滑动时它会抛出带有背景的整个项目。
RecyclerView 滑动的简单代码:
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT | ItemTouchHelper.DOWN | ItemTouchHelper.UP) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
Toast.makeText(ListActivity.this, "on Move", Toast.LENGTH_SHORT).show();
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
Toast.makeText(ListActivity.this, "on Swiped ", Toast.LENGTH_SHORT).show();
//Remove swiped item from list and notify the RecyclerView
int position = viewHolder.getAdapterPosition();
arrayList.remove(position);
adapter.notifyDataSetChanged();
}
};
然后使用以下语句为 recyclerView 设置回调:
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv);
SwipeableRecyclerView rv = findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(mAdapter);
rv.setListener(new SwipeLeftRightCallback.Listener() {
@Override
public void onSwipedLeft(int position) {
mList.remove(position);
mAdapter.notifyDataSetChanged();
}
@Override
public void onSwipedRight(int position) {
mList.remove(position);
mAdapter.notifyDataSetChanged();
}
});
用于两侧滑动的 xml
<com.tsuryo.swipeablerv.SwipeableRecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:leftBgColor="@color/colorAccent"
app:leftImage="@drawable/ic_remove"
app:leftText="Delete"
app:rightBgColor="@color/blue"
app:rightImage="@drawable/ic_check"
app:rightText="Read"
app:textColor="@android:color/white"
app:textSize="20sp" />
这是您的onCreate
中设置“向左滑动以删除”的最少代码:
binding.rows.adapter = adapter
ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
override fun onMove(v: RecyclerView, h: RecyclerView.ViewHolder, t: RecyclerView.ViewHolder) = false
override fun onSwiped(h: RecyclerView.ViewHolder, dir: Int) = adapter.removeAt(h.adapterPosition)
}).attachToRecyclerView(binding.rows)
这假设您的Adapter
类具有removeAt
函数。 我的看起来像这样:
fun removeAt(index: Int) {
items.removeAt(index) // items is a MutableList
notifyItemRemoved(index)
}
感谢@RahulRaina 的 Java 回答!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.