У меня есть RecyclerView, и я реализовал для него функцию смахивания. Однако я не могу заставить его работать должным образом. Я перепробовал много вещей, и все они меняют поведение, но никогда не заставляют его работать должным образом.
То, что я хочу, это:
- У меня есть 3 элемента в представлении .
- Проведите пальцем, чтобы удалить элемент
- Элемент 3 перемещается вверх, чтобы заполнить пространство, оставшееся при удалении элемента 2.
Я пробовал:
- adapter.notifyDataSetChanged ()
- adapter.notifyItemRemoved (позиция)
- adaptor.notifyItemRangeChanged (позиция, adapter.getItemCount ())
- комбинаций вышеуказанного
- ничего из вышеперечисленного
Вот соответствующий раздел кода, и я буду внимательно следить за этим потоком, чтобы при необходимости предоставить больше кода.
Этот код вызывается в onCreate ():
adapter = new ClientAdapter(options);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
/*
* This section handles what happens when you swipe an item in the recyclerView list
*/
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@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();
adapter.deleteClient(position);
// adapter.notifyDataSetChanged();
// adapter.notifyItemRemoved(position);
// adapter.notifyItemRangeChanged(position, adapter.getItemCount() - position);
}
}).attachToRecyclerView(recyclerView);
Опять же, я буду следить за тем, чтобы я мог предоставить больше кода, если потребуется.
Редактировать: Добавление код, который удаляет элемент, который происходит во время вызова выше на
adapter.deleteClient(position);
Этот код находится в Adapt Это класс ClientAdapter (который вы можете увидеть в начале предыдущего сегмента кода).
public void deleteClient(int position) {
getSnapshots().getSnapshot(position).getReference().delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//Log.d(TAG, "DocumentSnapshot successfully deleted!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//Log.w(TAG, "Error deleting document", e);
}
});
}
А вот полный класс адаптера:
public class ClientAdapter extends FirestoreRecyclerAdapter<Client, ClientAdapter.ClientHolder> {
private OnItemClickListener listener;
/**
* Create a new RecyclerView adapter that listens to a Firestore Query.
*/
public ClientAdapter(@NonNull FirestoreRecyclerOptions<Client> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull ClientHolder holder, int position, @NonNull Client model) {
String lastNameWithComma = model.getLastName() + ", ";
holder.textViewLastName.setText(lastNameWithComma);
holder.textViewFirstName.setText(model.getFirstName());
}
@NonNull
@Override
public ClientHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.client_list_item, parent, false);
return new ClientHolder(v);
}
public void deleteClient(int position) {
getSnapshots().getSnapshot(position).getReference().delete()
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
//Log.d(TAG, "DocumentSnapshot successfully deleted!");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
//Log.w(TAG, "Error deleting document", e);
}
});
}
class ClientHolder extends RecyclerView.ViewHolder {
TextView textViewLastName;
TextView textViewFirstName;
public ClientHolder(@NonNull View itemView) {
super(itemView);
textViewLastName = itemView.findViewById(R.id.rv_tv_last_name);
textViewFirstName = itemView.findViewById(R.id.rv_tv_first_name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position = getAdapterPosition();
if (position != RecyclerView.NO_POSITION && listener != null) {
listener.onItemClick(getSnapshots().getSnapshot(position), position);
}
}
});
}
}
public interface OnItemClickListener {
void onItemClick(DocumentSnapshot documentSnapshot, int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
}