如何在`firebaseRecyclerAdapter'中使用`notifyIteMredemerver''



我正在使用 firebase-ui从firebase检索我的数据。如果status等于"unlive",我想做的是将其显示给我的recyclerview。我已经在互联网上搜索了几天,但找不到解决方案。

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();                                                             
    }

首先,呼叫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));
    }
  }
}

如果计算差异需要很长时间(即列表很大),则您需要在背景线程上计算差异并将结果发布回主线程。

关于样式的旁注,我建议您避免使用班级名称中的下划线,而只是使用骆驼。班级名称中的下调与惯例。

相关内容

  • 没有找到相关文章

最新更新