Я также больше всего справился с проектом списка покупок, но столкнулся с проблемой. Мне нужно получить 2 элемента информации:
- bool, чтобы увидеть, проверена ли моя радио-кнопка;
- строка с именем моего местоположения.
Сложность состоит в том, что я хочу обновить базу данных SQLite, используя архитектуру ROOM из моего фрагмента. Я не могу выполнить обновление своей БД, так как мой фрагмент содержит ссылку на мою ViewModel и , мой адаптер содержит ссылку на мой счетчик и переключатель . Я хочу иметь возможность выполнять функции БД, когда в моем фрагменте появляется мое окно повторного просмотра. Я пробовал интерфейсы и методы получения, но не могу решить эту проблему. Пожалуйста, помогите!
вот мой макет карты:
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginRight="8dp"
app:cardCornerRadius="4dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp">
<TextView
android:id="@+id/textview_groceries_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLength="20"
android:paddingEnd="8dp"
android:paddingRight="8dp"
android:text="Sample Text"
android:textAppearance="@style/TextAppearance.AppCompat.Large"
app:fontFamily="@font/quicksand_light"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/location_textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sample location"
app:layout_constraintStart_toStartOf="@id/textview_groceries_item_name"
app:layout_constraintTop_toBottomOf="@id/textview_groceries_item_name" />
<RadioButton
android:id="@+id/radio_full_trolley"
android:layout_width="45dp"
android:layout_height="40dp"
android:background="@drawable/trolley_cart_selector"
android:button="@drawable/full_shopping_cart_small"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Spinner
android:id="@+id/spin_shop_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/radio_full_trolley" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
вот мой адаптер повторного просмотра:
public class GroceriesListAdapter extends RecyclerView.Adapter<GroceriesListAdapter.GroceriesItemHolder> {
private List<GroceriesListItem> ingredientsList = new ArrayList<>();
private List<String> shopNames = new ArrayList<>();
private ArrayAdapter<String> shopNameSpinnerAdapter;
@NonNull
@Override
public GroceriesItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//example list to fill spinner, will be changed in the future
shopNames.clear();
shopNames.add("SuperMarket");
shopNames.add("Green Grocer");
shopNames.add("Dollar Shop");
shopNames.add("Asian Market");
shopNames.add("Other");
View groceriesItemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardlayout_groceries_item, parent, false);
shopNameSpinnerAdapter = new ArrayAdapter<>(parent.getContext(), android.R.layout.simple_spinner_item, shopNames);
shopNameSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
return new GroceriesItemHolder(groceriesItemView);
}
@Override
public void onBindViewHolder(@NonNull final GroceriesListAdapter.GroceriesItemHolder holder, int position) {
GroceriesListItem currentGroceryItem = ingredientsList.get(position);
holder.textViewGroceriesItemName.setText(currentGroceryItem.getItemToBuy());
holder.placesSpinner.setAdapter(shopNameSpinnerAdapter);
}
@Override
public int getItemCount() {
return ingredientsList.size();
}
public void setGroceriesList(List<GroceriesListItem> ingredientsList) {
this.ingredientsList = ingredientsList;
notifyDataSetChanged();
}
class GroceriesItemHolder extends RecyclerView.ViewHolder {
private TextView textViewGroceriesItemName;
private Spinner placesSpinner;
private TextView textViewLocation;
private RadioButton trolleyCartStatus;
public GroceriesItemHolder(@NonNull View itemView) {
super(itemView);
textViewGroceriesItemName = itemView.findViewById(R.id.textview_groceries_item_name);
**placesSpinner = itemView.findViewById(R.id.spin_shop_name);**
textViewLocation = itemView.findViewById(R.id.location_textView);
**trolleyCartStatus = itemView.findViewById(R.id.radio_full_trolley);**
}
}
//this is for deleting the item in the fragment -- completed
public GroceriesListItem getListItemAt(int position) {
return ingredientsList.get(position);
}
}
Вот мой фрагмент:
public class GroceriesListFragment extends Fragment {
private ScheduleViewModel scheduleViewModel;
private GroceriesListViewModel groceriesListViewModel;
private RecyclerView groceriesRecyclerView;
private List<String> listOfCurrentMeals = new ArrayList<>();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final GroceriesListAdapter groceriesListAdapter = new GroceriesListAdapter();
groceriesListViewModel = new ViewModelProvider(getActivity()).get(GroceriesListViewModel.class);
scheduleViewModel = new ViewModelProvider(getActivity()).get(ScheduleViewModel.class);
scheduleViewModel.getMealSchedule().observe(getViewLifecycleOwner(), new Observer<List<MealSchedule>>() {
@Override
public void onChanged(List<MealSchedule> currentMealSchedule) {
//get all meals into a list and remove Not decided entries -- completed
for (MealSchedule oneDaysMeals : currentMealSchedule) {
String breakfastDish = oneDaysMeals.getBreakfastMeal();
String LunchDish = oneDaysMeals.getLunchMeal();
String DinnerDish = oneDaysMeals.getDinnerMeal();
if (breakfastDish.equals("Not Decided")) {
continue;
} else {
listOfCurrentMeals.add(breakfastDish);
}
if (LunchDish.equals("Not Decided")) {
continue;
} else {
listOfCurrentMeals.add(LunchDish);
}
if (DinnerDish.equals("Not Decided")) {
continue;
} else {
listOfCurrentMeals.add(DinnerDish);
}
}
//get current Groceries list and refresh list if changed -- completed
if (listOfCurrentMeals.isEmpty()) {
Toast.makeText(getContext(), "No items to show", Toast.LENGTH_SHORT).show();
} else {
groceriesListViewModel.clearList();
for (String dishNames : listOfCurrentMeals) {
scheduleViewModel.getOneDishItem(dishNames).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new DisposableMaybeObserver<Dish>() {
@Override
public void onSuccess(Dish dish) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient1(), false, ""));
if (!dish.getIngredient2().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient2(), false, ""));
}
if (!dish.getIngredient3().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient3(), false, ""));
}
if (!dish.getIngredient4().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient4(), false, ""));
}
if (!dish.getIngredient5().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient5(), false, ""));
}
if (!dish.getIngredient6().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient6(), false, ""));
}
if (!dish.getIngredient7().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient7(), false, ""));
}
if (!dish.getIngredient8().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient8(), false, ""));
}
if (!dish.getIngredient9().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient9(), false, ""));
}
if (!dish.getIngredient10().isEmpty()) {
groceriesListViewModel.insertIngredient(new GroceriesListItem(dish.getIngredient10(), false, ""));
}
}
@Override
public void onError(Throwable e) {
Toast.makeText(getContext(), "Something went wrong", Toast.LENGTH_SHORT).show();
}
@Override
public void onComplete() {
}
});
}
}
}
});
//get list of ingredients and observe changes
groceriesListViewModel.getCurrentList().observe(getViewLifecycleOwner(), new Observer<List<GroceriesListItem>>() {
@Override
public void onChanged(final List<GroceriesListItem> groceriesListItems) {
groceriesListAdapter.setGroceriesList(groceriesListItems);
}
});
View groceriesListFragmentView = inflater.inflate(R.layout.frag_groceries_list, container, false);
groceriesRecyclerView = groceriesListFragmentView.findViewById(R.id.groceries_list_recyclerview);
groceriesRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
groceriesRecyclerView.setAdapter(groceriesListAdapter);
//swipe to delete function -- completed
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.RIGHT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
groceriesListViewModel.deleteIngredient(groceriesListAdapter.getListItemAt(viewHolder.getAdapterPosition()));
}
}).attachToRecyclerView(groceriesRecyclerView);
//clear list function -- completed
final Button clearListButton = groceriesListFragmentView.findViewById(R.id.clear_list_button);
clearListButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
groceriesListViewModel.clearList();
}
});
//how to create a method with reference to spinner and radio button?
return groceriesListFragmentView;
}
}