Адаптер 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
,