Android Firebase RecyclerView适配器删除视图

时间:2018-04-02 13:53:17

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

我遇到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

如果它与要求不匹配,我可以改变适配器的可见性,但问题是,在使它的可见性消失之后它仍然存在着地方(但是看不见 - 仍然是一个空的空间)。如何避免完全填充回收站视图中的项目,而不是在要求不匹配时使其不可见?

1 个答案:

答案 0 :(得分:0)

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

如果你这样做,你就会为那个特定地点的每个孩子打电话onBindViewHolder。这意味着您将被要求为每个孩子制作一个view。您无法选择是否为该项目显示视图。

您似乎认为if方法中的onBindViewHolder语句会跳过这些项目。但实际发生的是你只是允许空视图占据列表中的那个位置。

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

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