我正在使用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();
}
答案 0 :(得分:0)
首先,同时调用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。类名中的下划线违反约定。