我遇到Firebase RecyclerView问题,我无法从RecyclerViews中删除不需要的CardView。在我的代码中,我检查城市的名称和指南选择的城市以匹配它们。仅当指南的城市与所选城市匹配时,它才会填充指南的详细信息,但它也会显示默认布局的空卡片视图。
guideDataRef = FirebaseDatabase.getInstance().getReference().child("Guides");
public void recycler() {
super.onStart();
try {
//Guide RecyclerView
Query guideQuery = guideDataRef.orderByKey();
guideQuery.keepSynced(true);
FirebaseRecyclerOptions guideOptions =
new FirebaseRecyclerOptions.Builder<UserModelClass>().setQuery(guideQuery, UserModelClass.class).build();
guideAdapter = new FirebaseRecyclerAdapter<UserModelClass, guideViewHolder>(guideOptions) {
@Override
protected void onBindViewHolder(@NonNull guideViewHolder holder, final int position, @NonNull final UserModelClass model) {
String pickedcity = model.getPickedCity();
String postname = (String) cityName.getText();
if(pickedcity.equals(postname)) {
final String guide_key= getRef(position).getKey();
holder.setGuideName(model.getName());
holder.setGuideSurname(model.getSurName());
holder.setGuideImage(getApplicationContext(), model.getPhotoURL());
// holder.mView.setVisibility(View.VISIBLE);
//Guide Click listener
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent guideHireIntent = new Intent(getApplication(), GuideHireActivity.class);
guideHireIntent.putExtra("guide_id", guide_key);
finish();
startActivity(guideHireIntent);
}
});
}
}
@NonNull
@Override
public guideViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout_guides, parent, false);
return new guideViewHolder(view);
}
@Override
public void onError(DatabaseError e){
Toast.makeText(getApplicationContext(), "Error by stopping ", Toast.LENGTH_SHORT).show();
}
@Override
public int getItemCount() {
return super.getItemCount();
}
@Override
public void onDataChanged() {
super.onDataChanged();
notifyDataSetChanged();
}
};
guideAdapter.notifyDataSetChanged();
guideRecyclerView.setAdapter(guideAdapter);
guideAdapter.startListening();
} catch (DatabaseException e) {
Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show();
}
}
enter image description here
enter image description here
如果它与要求不匹配,我可以改变适配器的可见性,但问题是,在使它的可见性消失之后它仍然存在着地方(但是看不见 - 仍然是一个空的空间)。如何避免完全填充回收站视图中的项目,而不是在要求不匹配时使其不可见?
答案 0 :(得分:0)
您没有在代码中显示guideDataRef
的内容,所以我假设它只是DatabaseReference
对象\Guides
以下的所有内容}节点。
如果你这样做,你就会为那个特定地点的每个孩子打电话onBindViewHolder
。这意味着您将被要求为每个孩子制作一个view
。您无法选择是否为该项目显示视图。
您似乎认为if
方法中的onBindViewHolder
语句会跳过这些项目。但实际发生的是你只是允许空视图占据列表中的那个位置。
相反,您应该想出一个query,它只生成您列表中感兴趣的项目。这意味着您必须告知Firebase符合您的条件的filter for children。
您还可以阅读该位置的全部内容,手动过滤掉您不想要的项目,并构建您想要的项目列表。然后,您可以使用该列表构建自定义适配器,然后它可以成为ListView
的输入,甚至更好地成为RecyclerView
的输入。