在 onBindViewHolder RecyclerView 中添加滑动
adding swipe inside onBindViewHolder RecyclerView
大家好,我正在尝试在 onBindViewHolder 中使用滑动,因为我的项目来自数据库,但我认为它似乎不起作用,因为我的应用程序崩溃了。我将此自定义光标适配器用于我的 recyclerview https://gist.github.com/skyfishjy/443b7448f59be978bc59 这是我的代码。
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
mItems = cursor;
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
final String title = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
final String desc = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
final String date = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));
viewHolder.title.setText(title);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, String.valueOf(id), Toast.LENGTH_SHORT).show();
}
});
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
int itemPosition = viewHolder.getAdapterPosition();
notifyItemRemoved(itemPosition);
dbHandler.deleteReminder(id);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
}
我是否可以通过滑动来关闭我在回收站视图中的物品?
从 onBindViewHolder 中删除以下代码块并添加到您的 activity 或初始化适配器的片段中。
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { // type cast your view holder
// CusrsorViewHolder cViewHolder = (CursorViewHolder)viewHolder;
int itemPosition = viewHolder.getAdapterPosition();
notifyItemRemoved(itemPosition);
dbHandler.deleteReminder(cViewHolder.id);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
//put the above code before the following method in your activity or fragment
//this.RecylerView.setAdapter(adapter)
在onBindViewHolder中设置你的id
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
mItems = cursor;
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
viewHolder.id = id;
}
使用下面的代码从列表中删除项目。 orderlist 是 RecyclerView 变量。
SwipeDismissRecyclerViewTouchListener touchListener =
new SwipeDismissRecyclerViewTouchListener(
orderlist,
new SwipeDismissRecyclerViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
return true;
}
@Override
public void onDismiss(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
/*db.deleteOrderProduct(ordereditems.get(position).getOrder_pro_Code());
if(position>1){
listposition = position-1;
}*/
//ordereditems.remove(position);
//adapter.notifyItemRemoved(position);
//adapter.notifyDataSetChanged();
//displayOrderList();
DeleteOrderById(position);
}
adapter.notifyDataSetChanged();
}
});
orderlist.setOnTouchListener(touchListener);
感谢@Waleed Sarwar 帮我解决了这个问题。
我正在为我的 recyclerviewcursoradapter 使用 https://gist.github.com/skyfishjy/443b7448f59be978bc59。
MainActivity.java
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
RemindersAdapter.ItemViewHolder itemViewHolder = (RemindersAdapter.ItemViewHolder)viewHolder;
int itemPosition = itemViewHolder.getAdapterPosition();
adapter.notifyItemRemoved(itemPosition);
// get the id of an item via itemViewHolder.id
dbHandler.deleteReminder(itemViewHolder.id);
// update cursor upon deleting do avoid
// the card from coming back upon swipe
adapter.swapCursor(dbHandler.getAllReminders());
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(listReminder);
RemindersAdapter.java
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
final String title = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
final String desc = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
final String date = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));
viewHolder.title.setText(title);
// pass id to viewholder to get in swipe
viewHolder.id = id;
}
public class ItemViewHolder extends RecyclerView.ViewHolder{
public int id;
TextView title;
public ItemViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.reminderTitle);
}
}
我正在使用 adapter.swapCursor(dbHandler.getAllReminders());来自我的适配器,它是抽象 class CursorRecyclerViewAdapter 的一种方法,它使光标在删除时更新,因为没有它,删除的项目将由 onBindViewHolder 重新创建。
大家好,我正在尝试在 onBindViewHolder 中使用滑动,因为我的项目来自数据库,但我认为它似乎不起作用,因为我的应用程序崩溃了。我将此自定义光标适配器用于我的 recyclerview https://gist.github.com/skyfishjy/443b7448f59be978bc59 这是我的代码。
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
mItems = cursor;
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
final String title = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
final String desc = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
final String date = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));
viewHolder.title.setText(title);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, String.valueOf(id), Toast.LENGTH_SHORT).show();
}
});
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
int itemPosition = viewHolder.getAdapterPosition();
notifyItemRemoved(itemPosition);
dbHandler.deleteReminder(id);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
}
我是否可以通过滑动来关闭我在回收站视图中的物品?
从 onBindViewHolder 中删除以下代码块并添加到您的 activity 或初始化适配器的片段中。
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { // type cast your view holder
// CusrsorViewHolder cViewHolder = (CursorViewHolder)viewHolder;
int itemPosition = viewHolder.getAdapterPosition();
notifyItemRemoved(itemPosition);
dbHandler.deleteReminder(cViewHolder.id);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(this.myRecyclerview);
//put the above code before the following method in your activity or fragment
//this.RecylerView.setAdapter(adapter)
在onBindViewHolder中设置你的id
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
mItems = cursor;
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
viewHolder.id = id;
}
使用下面的代码从列表中删除项目。 orderlist 是 RecyclerView 变量。
SwipeDismissRecyclerViewTouchListener touchListener =
new SwipeDismissRecyclerViewTouchListener(
orderlist,
new SwipeDismissRecyclerViewTouchListener.DismissCallbacks() {
@Override
public boolean canDismiss(int position) {
return true;
}
@Override
public void onDismiss(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
/*db.deleteOrderProduct(ordereditems.get(position).getOrder_pro_Code());
if(position>1){
listposition = position-1;
}*/
//ordereditems.remove(position);
//adapter.notifyItemRemoved(position);
//adapter.notifyDataSetChanged();
//displayOrderList();
DeleteOrderById(position);
}
adapter.notifyDataSetChanged();
}
});
orderlist.setOnTouchListener(touchListener);
感谢@Waleed Sarwar 帮我解决了这个问题。
我正在为我的 recyclerviewcursoradapter 使用 https://gist.github.com/skyfishjy/443b7448f59be978bc59。
MainActivity.java
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
RemindersAdapter.ItemViewHolder itemViewHolder = (RemindersAdapter.ItemViewHolder)viewHolder;
int itemPosition = itemViewHolder.getAdapterPosition();
adapter.notifyItemRemoved(itemPosition);
// get the id of an item via itemViewHolder.id
dbHandler.deleteReminder(itemViewHolder.id);
// update cursor upon deleting do avoid
// the card from coming back upon swipe
adapter.swapCursor(dbHandler.getAllReminders());
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(listReminder);
RemindersAdapter.java
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, Cursor cursor) {
final int id = cursor.getInt(cursor.getColumnIndex(MyDBHandler.COLUMN_ID));
final String title = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_TITLE_REMINDER));
final String desc = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DESC_REMINDER));
final String date = cursor.getString(cursor.getColumnIndex(MyDBHandler.COLUMN_DATE_REMINDER));
viewHolder.title.setText(title);
// pass id to viewholder to get in swipe
viewHolder.id = id;
}
public class ItemViewHolder extends RecyclerView.ViewHolder{
public int id;
TextView title;
public ItemViewHolder(View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.reminderTitle);
}
}
我正在使用 adapter.swapCursor(dbHandler.getAllReminders());来自我的适配器,它是抽象 class CursorRecyclerViewAdapter 的一种方法,它使光标在删除时更新,因为没有它,删除的项目将由 onBindViewHolder 重新创建。