Карты не обновляются после получения данных в Firestore - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь написать приложение для системы управления запасами, и единственное, что мне нужно сделать, - это иметь возможность отображать список категорий, на которые можно щелкнуть, чтобы затем перейти к списку продуктов в этом категория. Я использую CardView с RecyclerView, которые действуют на фрагмент (так как я использую панель навигации). Мне удалось добиться того, чтобы карты отображались успешно, если в заранее заданном списке ArrayList был передан элемент, но когда я теперь извлекаю данные из Firestore, ни одна из карт не отображается, но я все еще использую тот же список ArrayList, но данные просто приходит из другого источника. Я все еще новичок в Android и был бы очень признателен, если бы кто-нибудь мог мне помочь. Вот мой код для класса Fragment.

package com.example.drawerplayground;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;


import java.util.ArrayList;
import java.util.HashMap;

public class InventoryFragment extends Fragment {

    private TextView tv;
    private HashMap<String, Object> categories;
    private ArrayList<String> cats;
    private FirebaseFirestore db;
    private InventoryAdapter adapter;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        cats = new ArrayList<>();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View inventoryView = inflater.inflate(R.layout.fragment_inventory, container, false);
        RecyclerView recyclerView = (RecyclerView) inventoryView.findViewById(R.id.recycler_view);
        adapter = new InventoryAdapter(getContext(), cats);
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(gridLayoutManager);
        recyclerView.setAdapter(adapter);
        getCategories();
        return inventoryView;
    }

    public void getCategories()
    {
        cats = new ArrayList<>();
        db = FirebaseFirestore.getInstance();
        db.collection("categories")
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if(task.isSuccessful())
                        {
                            for(QueryDocumentSnapshot document : task.getResult())
                            {
                                cats.add(document.get("categoryName").toString());
                                Log.d("fragment", document.get("categoryName").toString());
                            }
                        }
                    }
                });
        adapter.notifyDataSetChanged();
    }


}

Я попытался использовать метод notifyDataSetChanged() для адаптера, а также попытался выполнить выборку данных в отдельной функции, как вы можете видеть выше.

--- РЕДАКТИРОВАТЬ --- Ниже вы можете увидеть мое основное c представление о том, как выглядит структура базы данных. У меня есть набор категорий, каждый документ является отдельной категорией, и каждый документ будет содержать id и поле categoryName. На данный момент это очень базовая c и небольшая структура, так как моей целью было поиграть с потенциальной функциональностью до того, как я начал сам проект. введите описание изображения здесь

1 Ответ

2 голосов
/ 07 августа 2020

Я заметил, что вы звоните 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();
}

Удачного кодирования!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...