简体   繁体   English

通过向右滑动从自定义RecycleView适配器中删除项目会弄乱项目的顺序

[英]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&lt;ChoresAdapter.ChoreViewHolder&gt;{

private ArrayList&lt;String&gt; chores;

public ChoresAdapter(ArrayList&lt;String&gt; 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&lt;&gt;();
    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM