我正在使用 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();
}
首先,呼叫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));
}
}
}
如果计算差异需要很长时间(即列表很大),则您需要在背景线程上计算差异并将结果发布回主线程。
关于样式的旁注,我建议您避免使用班级名称中的下划线,而只是使用骆驼。班级名称中的下调与惯例。