Невозможно правильно заполнить базу данных - PullRequest
0 голосов
/ 30 апреля 2020

Возможно, название вопроса не совсем правильное, но я не знаю, где именно проблема. Мне нужно создать RecyclerView с изображением и 2 текстами. Я могу сделать это с Activity, но я пытаюсь работать с Fragments и с некоторыми компонентами архитектуры, чтобы получить более чистый код.

Моя проблема в том, что когда Fragment с RecyclerView ничего не отображается, но я не знаю, так ли это, потому что база данных не имеет элементов, когда я пытаюсь ее заполнить, или потому, что что-то между репозиторием и моделью представления не правильно реализовано, или потому что некоторые другие причины, которые я полностью игнорирую.

Вот часть кода

FragmentHome

public class FragmentHome extends Fragment {
    private ViewModelMenuHome viewModelMenuHome;
    public FragmentHome() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_home, container, false);

        RecyclerView recyclerViewHomeMenu = v.findViewById(R.id.recyclerview_home) ;
        recyclerViewHomeMenu.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerViewHomeMenu.setHasFixedSize(true);
        AdapterHomeMenu adapterHomeMenu = new AdapterHomeMenu();
        recyclerViewHomeMenu.setAdapter(adapterHomeMenu);

        viewModelHomeMenu = new ViewModelProvider(getActivity()).get(ViewModelHomeMenu.class);
        viewModelHomeMenu.getAllElementosMenuHome().observe(getViewLifecycleOwner(), new Observer<List<EntityElementoMenuHome>>() {
            @Override
            public void onChanged(List<EntityElementoMenuHome> entityElementHomeMenu) {
                adapterMenuHome.setMenuHome(entityElementHomeMenu);
        /*I do this to se how many items the viewModel have, but it gives 0*/
        //Toast.makeText(getContext(), String.valueOf(
                //      viewModelMenuHome.getAllElementosMenuHome().getValue().size()
                //  ), Toast.LENGTH_SHORT).show(); 
            }
        });
        return v;
    }
}

Адаптер

public class AdapterHomeMenu extends RecyclerView.Adapter<AdapterHomeMenu.HomeMenuHolder> {
    private List<EntityElementHomeMenu> optionMenu = new ArrayList<>();

    @NonNull
    @Override
    public MenuHomeHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View optionMenu = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_cardview_home, parent, false);
        return new HomeMenuHolder(optionMenu);
   }

    @Override
    public void onBindViewHolder(@NonNull MenuHomeHolder holder, int position) {
        EntityElementHomeMenu currentOption = optionMenu.get(position);
        holder.imageHomeMenu.setImageAlpha(currentOption.getImgCardHomeMenu());
        holder.titleHomeMenu.setText(currentOption.getTitleCardHomeMenu());
        holder.descHomeMenu.setText(currentOption.getDescCardHomeMenu());

        Log.d("onBindViewHolder", String.valueOf(position));
    }

    //This method also gives 0
    @Override
    public int getItemCount() {
        return optionMenu.size();
    }

    public void setOpcionesMenuHome(List<EntityElementoMenuHome> elementHomeMenu){
        this.optionMenu = elementHomeMenu;
    //This will be changed later
        notifyDataSetChanged();
    }

    class MenuHomeHolder extends RecyclerView.ViewHolder{
        private ImageView imageHomeMen;
        private TextInputEditText titleHomeMenu;
        private TextInputEditText descHomeMen;

        public MenuHomeHolder(@NonNull View itemView) {
            super(itemView);
            imageHomeMenu = itemView.findViewById(R.id.img_cardview_home);
            titleHomeMenu = itemView.findViewById(R.id.txt_title_cardview_home);
            descHomeMenu = itemView.findViewById(R.id.txt_description_cardview_home);        }
    }
}

Viewmodel

public class ViewModelMenuHome extends AndroidViewModel {
    private RepositoryHomeMenu repositoryHomeMenu;
    private LiveData<List<EntityElementHomeMenu>> allElementsHomeMenu;

    public ViewModelMenuHome(@NonNull Application application) {
        super(application);
        repositorioMenuHome = new RepositoryHomeMenu(application);
        allElementosMenuHome = repositoryHomeMenu.selectAll();
    }

    public void insert(EntityElementoMenuHome entityElementoMenuHome){
        repositorioMenuHome.insert(entityElementoMenuHome);
    }
    public LiveData<List<EntityElementoMenuHome>> getAllElementosMenuHome() {
        return allElementosMenuHome;
    }
}

База данных

@Database(entities = {EntityElementoMenuHome.class}, version = 1)
public abstract class DatabaseAplication extends RoomDatabase {
    private static DatabaseAplication instance;

    public abstract DaoHomeMenu daoHomeMenu();

    public static synchronized DatabaseAplication getInstance(Context context){
        if(instance == null){
            instance = Room.databaseBuilder(context.getApplicationContext()
                    ,DatabaseAplicacion.class, "db_aplication")
                    .fallbackToDestructiveMigration()
                    .addCallback(roomCallback)
                    .build();
        }
        return instance;
    }

    /*This should populate the DB*/
    public static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback(){
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            new PopulateDBMenuHomeAsynkTask(instance).execute();
        }
    };

    private static class PopulateDBMenuHomeAsynkTask extends AsyncTask<Void, Void, Void>{
        private DaoHomeMenu daoHomeMenu;
        private PopulateDBMenuHomeAsynkTask(DatabaseAplicacion dbApp){
            daoHomeMenu = dbApp.daoHomeMenu();
        }
        @Override
        protected Void doInBackground(Void... voids) {
            daoMenuHome.insert(new EntityElementHomeMenu(
                    R.drawable.ic_img1, "EXAMPLE 1",
                    "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
                    ));
            daoMenuHome.insert(new EntityElementHomeMenu(
                    R.drawable.ic_img2, "EXAMPLE 2",
                    "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
            ));
            daoMenuHome.insert(new EntityElementHomeMenu(
                    R.drawable.ic_img3, "EXAMPLE 3",
                    "bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla"
            ));
            return null;
        }
    }
}


...