Я пытаюсь установить связь между моим Spinner и переключателем в адаптере RecyclerView с помощью Viewholder - PullRequest
1 голос
/ 27 апреля 2020

Я также больше всего справился с проектом списка покупок, но столкнулся с проблемой. Мне нужно получить 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;
}

}

...