Как использовать `notifyItemremoved` в` firebaserecycleradapter`? - PullRequest
0 голосов
/ 17 марта 2019

Я использую firebase-ui для извлечения моих данных из базы данных. То, что я хочу сделать, это удалить его с моего recyclerview, если status равно "unlive". Я искал в Интернете в течение нескольких дней, но не могу найти решение для этого.

mAdapter = new FirebaseRecyclerAdapter<Hotels_Model, Adapter_HotelsHolder>(mOptions) {
        @Override
        protected void onBindViewHolder(Adapter_HotelsHolder holder,int position, Hotels_Model model) {

            String status = model.getStatus();
            if (status.equals("unlive")) {
                mAdapter.notifyItemRemoved(holder.getAdapterPosition());
            }
         mAdapter.notifyDataSetChanged();                                                             
    }

1 Ответ

0 голосов
/ 17 марта 2019

Во-первых, не имеет смысла называть notifyItemRemoved и notifyDataSetChanged. Они достигают схожих целей, поэтому вам захочется позвонить одному или другому. notifyDataSetChanged сообщает адаптеру, что каждый вид должен быть восстановлен, и компоновка будет происходить так, как если бы вы только что подключили адаптер к RecyclerView. notifyItemRemoved уведомляет адаптер, что элемент по определенному индексу был удален. Это позволяет адаптеру выполнять соответствующие анимации для анимации удаления. Если у вас есть доступ к базовому списку Hotels_Model, вы должны удалить все "unlive" модели из коллекции. Затем вы можете позвонить notifyItemRemoved с соответствующей позиции (ей). Если имеется много удалений, вы можете использовать notifyItemRangeRemoved или DiffUtil, чтобы рассчитать все необходимые удаления и передать их в адаптер.

Вот пример адаптера, который использует DiffUtil для отправки обновлений на адаптер:

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.RecyclerView;

class Adapter extends RecyclerView.Adapter<ViewHolder> {

  public void updatePaths(List<String> oldPaths, List<String> newPaths) {
    DiffResult diffResult = DiffUtil.calculateDiff(new DiffCallback(oldPaths, newPaths));
    diffResult.dispatchUpdatesTo(this);
  }

  class DiffCallback extends DiffUtil.Callback {
    private List<String> oldPaths;
    private List<String> newPaths;

    DiffCallback(List<String> oldPaths, List<String> newPaths) {
      this.oldPaths = oldPaths;
      this.newPaths = newPaths;
    }

    @Override public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
      return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition);
    }

    @Override public int getOldListSize() {return oldPaths.size;}

    @Override public int getNewListSize() {return newPaths.size;}

    @Override public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
      return oldPaths.get(oldItemPosition).equals(newPaths.get(newItemPosition));
    }

  }
}

Если для вычисления разницы требуется много времени (т. Е. Список очень большой), вам нужно вычислить разность в фоновом потоке и отправить результат обратно в основной поток.

Примечание по стилю. Я бы рекомендовал отказаться от подчеркивания в именах классов и использовать только CamelCase. Подчеркивание в именах классов идет вразрез с соглашением.

...