[英]Removing item from a custom RecycleView adapter with swiping right messes up with the item order
I have an ArrayList
<String> with 6 items {"1", "2", "3", "4", "5", "6"}. 我有一个包含6个项{“ 1”,“ 2”,“ 3”,“ 4”,“ 5”,“ 6”}的
ArrayList
<String>。
I am representing these items with a CardView
. 我用
CardView
代表这些项目。 I want to remove the items with swiping left. 我想通过向左滑动来删除项目。
It looks like this: http://imgur.com/cuWoiB3 看起来像这样: http : //imgur.com/cuWoiB3
When I swipe right from number 2, it looks like this: http://imgur.com/5E9fwP0 当我从2号向右滑动时,它看起来像这样: http : //imgur.com/5E9fwP0
If I remove Number 5, it removes number 2. If I remove number 3, it removes number 1. It seems to be completely random. 如果我删除数字5,它将删除数字2。如果我删除数字3,它将删除数字1。这似乎是完全随机的。
Am I missing something here? 我在这里想念什么吗? How do I fix this?
我该如何解决?
Relevant code: 相关代码:
My adapter: 我的适配器:
public class ChoresAdapter extends RecyclerView.Adapter<ChoresAdapter.ChoreViewHolder>{
private ArrayList<String> chores;
public ChoresAdapter(ArrayList<String> chores){
this.chores = chores;
}
@Override
public ChoreViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_cardview, parent, false);
v.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
ChoreViewHolder pvh = new ChoreViewHolder(v);
return pvh;
}
@Override
public void onBindViewHolder(ChoreViewHolder holder, int position) {
holder.choreName.setText(this.chores.get(position));
}
@Override
public int getItemCount() {
return this.chores.size();
}
public void removeAt(int position) {
this.chores.remove(position);
notifyItemRemoved(position);
notifyDataSetChanged();
}
public static class ChoreViewHolder extends RecyclerView.ViewHolder {
CardView cv;
public static TextView choreName;
public static TextView personAge;
public static ImageView personPhoto;
ChoreViewHolder(View itemView) {
super(itemView);
cv = (CardView)itemView.findViewById(R.id.cv);
choreName = (TextView)itemView.findViewById(R.id.chore_name);
}
}
}
Relevant code in my fragment: 我的片段中的相关代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_chores, container, false);
RecyclerView rv = (RecyclerView)view.findViewById(R.id.rv);
rv.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(getActivity());
rv.setLayoutManager(llm);
chores = new ArrayList<>();
chores.add("1");
chores.add("2");
chores.add("3");
chores.add("4");
chores.add("5");
chores.add("6");
adapter = new ChoresAdapter(chores);
SwipeableRecyclerViewTouchListener swipeTouchListener =
new SwipeableRecyclerViewTouchListener(rv,
new SwipeableRecyclerViewTouchListener.SwipeListener() {
@Override
public boolean canSwipe(int position) {
return true;
}
@Override
public void onDismissedBySwipeLeft(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
adapter.removeAt(position);
}
}
@Override
public void onDismissedBySwipeRight(RecyclerView recyclerView, int[] reverseSortedPositions) {
for (int position : reverseSortedPositions) {
adapter.removeAt(position);
}
}
});
rv.addOnItemTouchListener(swipeTouchListener);
rv.setAdapter(adapter);
return view;
}
Its bit late, I just fall into the same situation and got answer, Just use 有点晚了,我陷入了同样的情况并得到了答案,只是使用
chores.remove(position);
adapter.notifyDataSetChanged();
You dont need to do that on the adapter class. 您不需要在适配器类上执行此操作。
You can use below code ( ItemTouchHelper.SimpleCallback
from Android support V7) to remove the cards from RecyclerView using swipe gesture. 您可以使用以下代码(Android支持V7中的
ItemTouchHelper.SimpleCallback
)通过滑动手势从RecyclerView中移除卡片。 You need to remove element from your ArrayList as well when you swipe it from RecyclerView. 从RecyclerView滑动时,还需要从ArrayList中删除元素。
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) {
chores.remove(viewHolder.getAdapterPosition());
adapter.notifyItemRemoved(viewHolder.getAdapterPosition());
}
@Override
public void onMoved(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, int fromPos, RecyclerView.ViewHolder target, int toPos, int x, int y) {
super.onMoved(recyclerView, viewHolder, fromPos, target, toPos, x, y);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recList);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.