Возможно, название вопроса не совсем правильное, но я не знаю, где именно проблема. Мне нужно создать 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;
}
}
}