Я столкнулся с проблемой Firebase RecyclerView, когда я не могу удалить ненужные CardView из моих 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();
}
}
введите описание изображения здесь
введите описание изображения здесь
Я могу изменить видимость адаптера, чтобы он исчез, если он не соответствует требованиям, но проблема в том, что после того, как видимость исчезла, он все еще удерживает место (но невидимо - все еще остается пустое место). Как я могу избежать полного заполнения элемента из представления ресайклера вместо того, чтобы сделать его невидимым, если требования не совпадают?




Вы не показываете, что такое guideDataRef в вашем коде, поэтому я предполагаю, что это просто объект DatabaseReference для всего, что находится ниже узла \Guides.
Если вы это сделаете, вам позвонят по onBindViewHolder для каждого ребенка в этом конкретном месте. Это означает, что вас попросят создать view для дочернего каждый. Вы не можете выбрать, будет ли отображаться представление для этого элемента.
Похоже, вы предполагаете, что ваш оператор if в методе onBindViewHolder пропустит эти элементы. Но на самом деле происходит то, что вы просто позволяете пустому представлению занять это место в списке.
Вместо этого вы должны придумать запрос, который генерирует только элементы, представляющие интерес для вашего списка. Это означает, что вам нужно сообщить Firebase фильтр для детей, который соответствует вашим критериям.
Вы также можете прочитать все содержимое локации, вручную отфильтровать ненужные элементы и составить список нужных элементов. Затем вы можете создать собственный адаптер с этим списком, и затем он может стать входом для ListView или даже лучше для RecyclerView.
Это именно то, о чем я думал. Хорошо, попробуй и держи меня в курсе.
Все в порядке? Вы решили проблему?
Уважаемый Алекс, к сожалению, я не могу решить проблему. В настоящий момент я сижу в Интернете, чтобы найти лучшее решение.
Где вы застряли при использовании моего решения?
Создание собственного адаптера
Расскажи взглядом здесь.
Спасибо я посмотрю
Хорошо, держи меня в курсе.
Извините, что так долго. Это действительно сработало :) Спасибо, мистер Алекс, за вашу помощь
Приятно слышать, что это сработало! В этом случае рассмотрите возможность принятия моего ответа, нажав на галочку слева под стрелками голосования. Должен поменять цвет на зеленый. Спасибо!
@AlexMamo, мне нужна твоя помощь. Я пытался связаться с вами, но не могу найти вашу учетную запись в Facebook.
Спасибо за ответ. Я только что обновил свой код (показывает guideDataRef). Постараюсь реализовать ваше решение