Активные данные не обновляют интерфейс при инициализации - PullRequest
0 голосов
/ 21 апреля 2020

LiveData Not Updates UI При первом создании представления

Отображается только после переключения между фрагментами.

Фрагмент

Это мой домашний фрагмент. Здесь я инициализировал ViewModel и наблюдаю за значениями LiveDate.

viewModel = new ViewModelProvider(requireActivity()).get(HomeFragmentViewModel.class);
viewModel.init();

categoryAdapter = new CategoryAdapter(getContext(),viewModel.getCategories().getValue());
newRecipeAdapter = new HomeRecipeAdapter(getContext(),viewModel.getNewRecipes().getValue());

viewModel.getCategories().observe(getViewLifecycleOwner(), new Observer<ArrayList<CategoryList>>() {
            @Override
            public void onChanged(ArrayList<CategoryList> categoryLists) {
                categoryAdapter.notifyDataSetChanged();
            }
        });

viewModel.getNewRecipes().observe(getViewLifecycleOwner(), new Observer<ArrayList<NewRecipes>>() {
            @Override
            public void onChanged(ArrayList<NewRecipes> newRecipes) {
                newRecipeAdapter.notifyDataSetChanged();
            }
        });

ViewModel

Это мой класс ViewModel

public class HomeFragmentViewModel extends ViewModel {

    private MutableLiveData<ArrayList<CategoryList>> categoryLists;
    private MutableLiveData<ArrayList<NewRecipes>> newRecipes;

    public void init(){
        if (categoryLists!=null&&newRecipes!=null){
            return;
        }
        categoryLists = HomeRepo.getInstance().getCategories();
        newRecipes = HomeRepo.getInstance().getNewRecipes();
    }

    public LiveData<ArrayList<CategoryList>> getCategories() {

        return categoryLists;
    }

    public LiveData<ArrayList<NewRecipes>> getNewRecipes() {

        return newRecipes;
    }

}

Репо

Это мой репо для получения данных из базы данных.

public class HomeRepo {

    private static HomeRepo instance;
    private ArrayList<CategoryList> categoryLists = new ArrayList<>();
    private MutableLiveData<ArrayList<CategoryList>> category = new MutableLiveData<>();

    private ArrayList<NewRecipes> newRecipesLists = new ArrayList<>();
    private MutableLiveData<ArrayList<NewRecipes>> newRecipe = new MutableLiveData<>();


    public static HomeRepo getInstance(){
        if (instance==null){
            instance = new HomeRepo();
        }
        return instance;
    }

    public MutableLiveData<ArrayList<CategoryList>> getCategories(){
        if (categoryLists.size()==0){
            loadCategories();
        }

        category.setValue(categoryLists);

        return category;
    }

    public MutableLiveData<ArrayList<NewRecipes>> getNewRecipes(){
        if (newRecipesLists.size()==0){
            loadNewRecipes();
        }

        newRecipe.setValue(newRecipesLists);

        return newRecipe;
    }

    private void loadNewRecipes() {
        DatabaseReference newRecipeRef = FirebaseDatabase.getInstance().getReference().child("lt");
        newRecipeRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                newRecipesLists = new ArrayList<>();
                for(DataSnapshot items : dataSnapshot.getChildren())
                {
                    newRecipesLists.add(items.getValue(NewRecipes.class));
                }
                newRecipe.postValue(newRecipesLists);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });
    }

    private void loadCategories() {
        DatabaseReference categoryRef = FirebaseDatabase.getInstance().getReference().child("cl");
        categoryRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                categoryLists = new ArrayList<>();
                for(DataSnapshot items : dataSnapshot.getChildren())
                {
                    categoryLists.add(items.getValue(CategoryList.class));
                }
                category.postValue(categoryLists);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

    }


}

Если я инициализирую MutableLiveData в View Model и получаю размер списка в onCreateView, он создает NullPointerException в качестве попытки вызова виртуального метода для ссылки на нулевой объект

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