Android Firebase RecyclerView 适配器删除视图

Android Firebase RecyclerView Adapter Remove Views

我遇到了一个 Firebase RecyclerView 问题,我无法从我的 RecyclerView 中删除不需要的 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

如果它不符合要求,我可以将适配器可见性更改为消失,但问题是在使其可见性消失后,它仍然存在(但不可见 - 仍然是空的 space).我怎样才能避免完全从回收站视图中填充一个项目,而不是在要求不匹配时使其不可见?

你没有在你的代码中显示 guideDataRef 是什么,所以我假设它只是一个 DatabaseReference object 用于 \Guides 节点下的所有内容.

如果您这样做,您将在该特定位置为每个 child 接到 onBindViewHolder 的呼叫。这意味着您将被要求为 每个 child 制作一个 view。您无法选择是否显示该项目的视图。

您似乎假设 if 方法中的 if 语句将跳过这些项目。但实际发生的情况是,您只是让一个空视图占据列表中的那个位置。

相反,您应该想出一个 query that generates only the items of interest to your list. This means you'll have to tell Firebase to filter for children 符合您的标准。

您还可以阅读该位置的全部内容,手动过滤掉您不想要的项目,然后构建您想要的项目列表。然后,您可以使用该列表构建一个自定义适配器,然后它可以成为 ListView 的输入,甚至更好地成为 RecyclerView.

的输入