Адаптер Android Firebase RecyclerView Удалить вид

Я сталкиваюсь с проблемой Firebase RecyclerView, когда я не могу удалить ненужные CardViews из своих RecyclerViews. В моем коде я проверяю название города и выбранный город гида, чтобы соответствовать им. Он заполняет данные гида только в том случае, если город гида совпадает с выбранным городом, но также показывает пустое представление карты с макетом по умолчанию.

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();

        }

    }

введите описание изображения здесь
введите описание изображения здесь

Я могу изменить видимость адаптера на пропавший, если он не соответствует требованиям, но проблема в том, что после того, как видимость пропала, он все еще там удерживает место (но невидимо - все еще остается пустое место). Как я могу избежать полного заполнения элемента из представления переработчика, вместо того чтобы сделать его невидимым, если требования не соответствуют?

1 ответ

Решение

Вы не показываете, что guideDataRef в вашем коде, поэтому я предполагаю, что это простоDatabaseReference объект для всего под \Guides узел.

Если вы делаете это, вы получите звонок для onBindViewHolder для каждого ребенка в этом конкретном месте. Это означает, что вас попросят сделать view для каждого ребенка. Вы не можете выбрать, будет ли отображаться представление для этого элемента.

Похоже, вы предполагаете, что ваш if заявление в onBindViewHolder Метод пропустит эти элементы. Но на самом деле происходит то, что вы просто позволяете пустому представлению занимать это место в списке.

Вместо этого вы должны создать запрос, который генерирует только элементы, представляющие интерес для вашего списка. Это означает, что вы должны указать Firebase, чтобы он фильтровал детей, которые соответствуют вашим критериям.

Вы также можете прочитать все содержимое местоположения, вручную отфильтровать ненужные элементы и составить список необходимых элементов. Затем вы можете создать собственный адаптер с этим списком, и он может стать входом для ListView или даже лучше RecyclerView,

Другие вопросы по тегам