Я заметил, что вы звоните adapter.notifyDataSetChanged()
, но я не смог найти, где вы на самом деле передаете обновленный список кошек вашему адаптеру.
Вам следует настроить адаптер и сделать следующие изменения -
Добавить setCatList()
метод
public void setCatList(List<String> catList) {
this.catList= catList;
notifyDataSetChanged();
}
Измените свой getItemCount()
метод
@Override
public int getItemCount() {
if (catList!= null)
return catList.size();
else
return 0;
}
Таким образом, структура вашего InventoryAdapter будет следующей -
public class InventoryAdapter extends RecyclerView.Adapter<InventoryAdapter.CustomViewHolder> {
private Context context;
private List<String> catList;
public InventoryAdapter(Context context) {
this.context = context;
}
public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new CustomViewHolder(LayoutInflater.from(context).inflate(R.layout.cat_item_layout, parent, false));
}
@Override
public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
// setup binding of views
}
public void setCatList(List<String> catList) {
this.catList= catList;
notifyDataSetChanged();
}
@Override
public int getItemCount() {
if (catList!= null)
return catList.size();
else
return 0;
}
//inner class of CustomViewHolder
}
Тогда вам не нужно создавать new ArrayList<>()
под onCreate()
и onCreateView()
. Вот как вы создадите свой адаптер -
adapter = new InventoryAdapter(getContext());
и getCategories()
будут иметь следующий вид -
public void getCategories()
{
db = FirebaseFirestore.getInstance();
db.collection("categories")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful())
{
List<String> cats = new ArrayList();
for(QueryDocumentSnapshot document : task.getResult()){
cats.add(document.get("categoryName").toString());
Log.d("fragment", document.get("categoryName").toString());
}
adapter.setCatList(cats ); //simply give updated cats list to recycle adapter
}
}
});
}
Нет необходимости звонить adapter.notifyDataSetChanged()
, потому что об этом позаботится setCatList()
метод адаптера.
Если вы хотите сохранить catList, вы можете изменить setCatList()
соответственно, поставив галочку if, есть ли уже какие-то данные или нет, как показано ниже -
public void setCatList(List<String> catList) {
if(this.catList!=null){
if(this.catList.size()!=0){
//there is some cat item inside already, take action accordingly
}
else
this.catList= catList;
}
else{
this.catList= catList;
}
notifyDataSetChanged();
}
Удачного кодирования!