Как реализовать добавление в избранное в БД при нажатии на кнопку?

Есть приложение с рецептами. Список рецептов выводится в RecyclerView из адаптера. Хранятся рецепты в БД SQLite При нажатии на рецепт открывается окно с его подробностями/возможностью редактирования. Хочу в окно с подробностями добавить кнопку, которая добавляла бы рецепт в избранное. В саму базу данных я добавил поле favorite и у всех новых рецептов задаю туда значение 0. Как я понимаю, для добавления в избранное нужно писать отдельный адаптер. Хотел узнать, может есть какие то подсказки как лучше это реализовать?

Листинг самого фрагмента с рецептами:

public class FragmentRecipe extends Fragment
{
    private MyDBManager myDbManager;
    private RecyclerView rcView;
    private MainAdapter mainAdapter;
    public FragmentRecipe() {}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        setHasOptionsMenu(true);
        return inflater.inflate(R.layout.fragment_recipe, container, false);
    }

    @Override
    public void onStart()
    {
        super.onStart();
        init();
    }

    public void init()
    {
        myDbManager = new MyDBManager(this.getActivity());
        rcView = (RecyclerView)getActivity().findViewById(R.id.rcView);
        mainAdapter = new MainAdapter(this.getActivity());
        rcView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        getItemTouchHelper().attachToRecyclerView(rcView);
        rcView.setAdapter(mainAdapter);
    }

    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
        inflater.inflate(R.menu.main, menu);
        MenuItem item = menu.findItem(R.id.id_searchV);
        SearchView sv = (SearchView) item.getActionView();
        super.onCreateOptionsMenu(menu, inflater);

        sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                mainAdapter.updateAdapter(myDbManager.getFromDb(s));
                return false;
            }
        });

    }

    @Override
    public void onResume()
    {
        super.onResume();

        myDbManager.openDb();
        mainAdapter.updateAdapter(myDbManager.getFromDb(""));
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        myDbManager.closeDb();
    }

    private ItemTouchHelper getItemTouchHelper() {
        return new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT)
        {
            @Override
            public void onSwiped(@NonNull @NotNull RecyclerView.ViewHolder viewHolder, int direction)
            {
                int pos = viewHolder.getAdapterPosition();
                AlertDialog.Builder builder = new AlertDialog.Builder(viewHolder.itemView.getContext());
                builder.setMessage("Вы уверены, что хотите удалить этот рецепт?");
                builder.setPositiveButton("Да", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        mainAdapter.removeItem(pos, myDbManager);
                    }
                });
                builder.setNegativeButton("Нет", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        mainAdapter.notifyItemChanged(pos);
                    }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
            }

            @Override
            public boolean onMove(@NonNull @NotNull RecyclerView recyclerView, @NonNull @NotNull RecyclerView.ViewHolder viewHolder, @NonNull @NotNull RecyclerView.ViewHolder target)
            {
                return false;
            }
        });
    }
}

Листинг моего адаптера:

public class MainAdapter extends RecyclerView.Adapter<MainAdapter.MyViewHolder>
{
    private Context context;
    private List<ListItem> mainArray;

    public MainAdapter(Context context) {
        this.context = context;
        mainArray = new ArrayList<>();
    }

    @NonNull
    @NotNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType)
    {
        View view = LayoutInflater.from(context)
                .inflate(R.layout.item_list_layout, parent, false);
        return new MyViewHolder(view, context, mainArray);
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull MyViewHolder holder, int position)
    {
        holder.setData(mainArray.get(position).getTitle(), mainArray.get(position).getProducts());
    }

    @Override
    public int getItemCount()
    {
        return mainArray.size();
    }

    static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
    {
        private Context context;
        private TextView tvTitle, tvProducts;
        private List<ListItem> mainArray;
        public MyViewHolder(@NonNull @NotNull View itemView, Context context, List<ListItem> mainArray)
        {
            super(itemView);
            this.context = context;
            this.mainArray = mainArray;
            tvTitle = itemView.findViewById(R.id.tvTitle);
            tvProducts = itemView.findViewById(R.id.tvProducts);
            itemView.setOnClickListener(this);
        }

        public void setData(String title, String products)
        {
            tvTitle.setText(title);
            tvProducts.setText(products);
        }

        @Override
        public void onClick(View v)
        {
            Intent i = new Intent(context, EditActivity.class);
            i.putExtra(MyConstans.LIST_ITEM_INTENT, mainArray.get(getAdapterPosition()));
            i.putExtra(MyConstans.EDIT_STATE, false);
            context.startActivity(i);
        }
    }

    public void updateAdapter(List<ListItem> newList)
    {
        mainArray.clear();
        mainArray.addAll(newList);
        notifyDataSetChanged();
    }

    public void removeItem(int pos, MyDBManager dbManager)
    {
        dbManager.delete(mainArray.get(pos).getId());
        mainArray.remove(pos);
        notifyItemRangeChanged(0, mainArray.size());
        notifyItemRemoved(pos);
    }

}

Листинг myDbManager

public class MyDBManager
{
    private Context context;
    private MyDBHelper myDbHelper;
    private SQLiteDatabase db;

    public MyDBManager(Context context)
    {
        this.context = context;
        myDbHelper = new MyDBHelper(context);
    }

    public void openDb()
    {
        db = myDbHelper.getWritableDatabase();
    }

    public void insertToDb(String title, String products, String desc, String calories, String uri, int fav)
    {
        ContentValues cv = new ContentValues();
        cv.put(MyConstans.TITLE, title);
        cv.put(MyConstans.DESC, desc);
        cv.put(MyConstans.URI, uri);
        cv.put(MyConstans.PRODUCTS, products);
        cv.put(MyConstans.CALORIES, calories);
        cv.put(MyConstans.FAVORITE, fav);
        db.insert(MyConstans.TABLE_NAME, null, cv);
    }

    public void update(String title, String products, String desc, String calories, String uri, int id, int fav)
    {
        String selection = MyConstans._ID + "=" + id;
        ContentValues cv = new ContentValues();
        cv.put(MyConstans.TITLE, title);
        cv.put(MyConstans.DESC, desc);
        cv.put(MyConstans.URI, uri);
        cv.put(MyConstans.PRODUCTS, products);
        cv.put(MyConstans.CALORIES, calories);
        cv.put(MyConstans.FAVORITE, fav);
        db.update(MyConstans.TABLE_NAME, cv, selection, null);
    }

    public void delete(int id)
    {
        String selection = MyConstans._ID + "=" + id;
        db.delete(MyConstans.TABLE_NAME, selection, null);
    }

    public List<ListItem> getFromDb(String titleSearch)
    {
        List<ListItem> tempList = new ArrayList<>();
        String selection = MyConstans.TITLE + " like ?";
        Cursor cursor = db.query(MyConstans.TABLE_NAME, null,
                selection, new String[]{"%" + titleSearch + "%"}, null, null, null);

        while (cursor.moveToNext())
        {
            ListItem item = new ListItem();
            String title = cursor.getString(cursor.getColumnIndexOrThrow(MyConstans.TITLE));
            String desc = cursor.getString(cursor.getColumnIndexOrThrow(MyConstans.DESC));
            String uri = cursor.getString(cursor.getColumnIndexOrThrow(MyConstans.URI));
            String products = cursor.getString(cursor.getColumnIndexOrThrow(MyConstans.PRODUCTS));
            String calories = cursor.getString(cursor.getColumnIndexOrThrow(MyConstans.CALORIES));
            int _id = cursor.getInt(cursor.getColumnIndexOrThrow(MyConstans._ID));
            item.setTitle(title);
            item.setDesc(desc);
            item.setUri(uri);
            item.setProducts(products);
            item.setCalories(calories);
            item.setId(_id);
            tempList.add(item);
        }

        cursor.close();
        return tempList;
    }

    public void closeDb()
    {
        myDbHelper.close();
    }
}

Ответы (0 шт):