从 ItemTouchHelper 删除最后一个位置时,第一个被删除
When deleting the last position from ItemToucjHelper , the first one is deleted
下午好!哪天我绞尽脑汁我不明白为什么会这样:(
当您滑动删除最后一个位置时,第一个位置也被删除,这种情况只发生在最后一个位置。
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() && o1.isDone()) {
return 1;
}
if (o2.isDone() && !o1.isDone()) {
return -1;
}
return (int) (o2.timestamp - o1.timestamp);
}
...
如有任何帮助,我们将不胜感激。
添加到适配器:
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()));
} ...
下午好!哪天我绞尽脑汁我不明白为什么会这样:( 当您滑动删除最后一个位置时,第一个位置也被删除,这种情况只发生在最后一个位置。
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() && o1.isDone()) {
return 1;
}
if (o2.isDone() && !o1.isDone()) {
return -1;
}
return (int) (o2.timestamp - o1.timestamp);
}
...
如有任何帮助,我们将不胜感激。
添加到适配器:
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()));
} ...