Android FireStore RecyclerView onSwiped метод не обновляет RecyclerView - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть RecyclerView, и я реализовал для него функцию смахивания. Однако я не могу заставить его работать должным образом. Я перепробовал много вещей, и все они меняют поведение, но никогда не заставляют его работать должным образом.

То, что я хочу, это:

  1. У меня есть 3 элемента в представлении .
  2. Проведите пальцем, чтобы удалить элемент
  3. Элемент 3 перемещается вверх, чтобы заполнить пространство, оставшееся при удалении элемента 2.

Я пробовал:

  1. adapter.notifyDataSetChanged ()
  2. adapter.notifyItemRemoved (позиция)
  3. adaptor.notifyItemRangeChanged (позиция, adapter.getItemCount ())
  4. комбинаций вышеуказанного
  5. ничего из вышеперечисленного

Вот соответствующий раздел кода, и я буду внимательно следить за этим потоком, чтобы при необходимости предоставить больше кода.

Этот код вызывается в 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;
}
}
...