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

问题描述 投票:0回答:1

我正在使用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();                                                             
    }
android firebase firebase-realtime-database android-recyclerview firebaseui
1个回答
0
投票

首先,调用notifyItemRemovednotifyDataSetChanged都没有意义。他们实现了类似的目标,所以你要打电话给其中一个。 notifyDataSetChanged告诉适配器每个视图都应该反弹,布局会发生,好像你刚刚将适配器连接到RecyclerViewnotifyItemRemoved通知适配器已删除特定索引处的项目。这允许适配器执行相关动画以动画删除。如果您可以访问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。类名中的下划线违反惯例。

© www.soinside.com 2019 - 2024. All rights reserved.