如何在`firebaserecycleradapter`中使用`notifyItemremoved`?

时间:2019-03-17 17:01:50

标签: android firebase firebase-realtime-database android-recyclerview firebaseui

我正在使用firebase-ui从Firebase检索我的数据。我想做的是,如果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 :(得分:0)

首先,同时调用notifyItemRemovednotifyDataSetChanged是没有意义的。它们实现了相似的目标,因此您需要互相称呼。 notifyDataSetChanged告诉适配器,每个视图都应反弹,并且布局将像您刚刚将适配器连接到RecyclerView一样进行。 notifyItemRemoved通知适配器已删除特定索引处的项目。这允许适配器执行相关的动画来动画化移除。如果您有权访问Hotels_Model的基础列表,则应从集合中删除所有"unlive"模型。然后,您可以致电相关职位的notifyItemRemoved。如果清除数量很多,则可以使用notifyItemRangeRemovedDiffUtil为您计算所有必需的清除并将其传递给适配器。

这是一个示例适配器,它使用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。类名中的下划线违反约定。