Как реализовать добавление в избранное в БД при нажатии на кнопку?
Есть приложение с рецептами. Список рецептов выводится в 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();
}
}