При удалении последней позиции из ItemToucjHelper первая позиция удаляется

#java #android #android-recyclerview #android-room #itemtouchhelper

#java #Android #android-recyclerview #android-комната #itemtouchhelper

Вопрос:

Добрый день! Который день я ломаю голову, я не могу понять, почему это происходит:( Когда вы удаляете последнюю позицию с помощью салфетки, первая удаляется, это происходит только с последней позицией.

 private NotesAdapter notesAdapter;
private AlertDialog dialogURL;
private static ArrayList<Note> notesFromDB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(v -> {
        if (!isClick) {
            DetailNoteActivity.start(MainActivity.this, null);
            isClick = true;
        }
    });

    RecyclerView recyclerViewNotes = findViewById(R.id.rv_notes);
    recyclerViewNotes.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));

    notesFromDB = new ArrayList<>();
    notesAdapter = new NotesAdapter();

    MainViewModel viewModel = new ViewModelProvider(this).get(MainViewModel.class);
    viewModel.getNotes().observe(this, notes -> {
        notesFromDB = (ArrayList<Note>) notes;
        notesAdapter.setItems(notesFromDB);
    });
 

     private final ItemTouchHelper.SimpleCallback simpleCallback =
        new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT) {
            @Override
            public boolean onMove(@NonNull RecyclerView recyclerView,
                                  @NonNull RecyclerView.ViewHolder viewHolder,
                                  @NonNull RecyclerView.ViewHolder target) {
                return false;
            }

            @Override
            public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
                int position = viewHolder.getAdapterPosition();
                App.getInstance().getNoteDao().deleteNote(notesFromDB.get(position));
                notesAdapter.notifyItemRemoved(position);

            }
        };
 

Адаптер

 public class NotesAdapter extends RecyclerView.Adapter<NotesAdapter.NoteViewHolder> {

private final SortedList<Note> sortedList;

public NotesAdapter() {
    sortedList = new SortedList<>(Note.class, new SortedList.Callback<Note>() {
        @Override
        public int compare(Note o1, Note o2) {
            if (!o2.isDone() amp;amp; o1.isDone()) {
                return 1;
            }
            if (o2.isDone() amp;amp; !o1.isDone()) {
                return -1;
            }
            return (int) (o2.timestamp - o1.timestamp);
        }
 

Любая помощь будет принята с благодарностью.

Комментарии:

1. Было бы лучше, если бы вы поделились некоторым кодом.

Ответ №1:

Добавить в адаптер:

 public Note getNoteAt(int position){
return sortedList.get(position);
 

} …

С помощью салфетки:

 @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        App.getInstance().getNoteDao().deleteNote(notesAdapter.getNoteAt(viewHolder.getAdapterPosition()));

    } ...