【问题标题】:Android Firebase RecyclerView Adapter Remove ViewsAndroid Firebase RecyclerView Adapter 移除视图
【发布时间】:2018-04-02 13:53:16
【问题描述】:

我面临一个 Firebase RecyclerView 问题,我无法从我的 RecyclerViews 中删除不需要的 CardViews。在我的代码中,我检查城市名称和导游选择的城市以匹配它们。只有当指南的城市与选择的城市匹配时,它才会填充指南的详细信息,但它也会显示具有默认布局的空卡片视图。

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

如果适配器的可见性不符合要求,我可以将其更改为消失,但问题是,在使其可见性消失后,它仍然保留该位置(但不可见 - 仍然有一个空白空间)。如何避免完全从回收站视图中填充项目,而不是在要求不匹配时使其不可见?

【问题讨论】:

    标签: java android firebase firebase-realtime-database sectionedrecyclerviewadapter


    【解决方案1】:

    您没有在代码中显示 guideDataRef 是什么,所以我假设它只是 DatabaseReference 对象,用于 \Guides 节点下的所有内容。

    如果您这样做,您将收到针对该特定位置的每个孩子的onBindViewHolder 电话。这意味着您将被要求为每个孩子创建一个view。您无法选择是否为该项目显示视图。

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

    相反,您应该提出一个query,它只生成您列表中感兴趣的项目。这意味着您必须将符合您条件的 Firebase 告知 filter for children

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

    【讨论】:

    • 感谢您的回答。我刚刚更新了我的代码(显示 guideDataRef)。我将尝试实施您的解决方案
    • 这正是我所想的。好的,试试看,让我知道。
    • 一切都好吗?问题解决了吗?
    • 亲爱的 Alex,很遗憾我无法解决问题。目前,我正在上网寻找最佳解决方案。
    • 您在使用我的解决方案时遇到了什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2016-07-15
    • 1970-01-01
    • 2013-11-28
    • 2020-06-19
    相关资源
    最近更新 更多