Есть RecyclerView, в который из готовой БД выводятся данные. Каждый отдельный элемент в RecyclerView имеет кнопку для добавления данной записи в избранное (btnFavorite). В адаптере элементы в списке имеют правильную нумерацию. Т.е. первый элемент в списке имеет id = 1 и т.д. Проблема возникает когда я нажимаю на кнопку "Добавить в избранное", в этот момент (момент нажатия), почему-то у первого элемента списка id <> 1, и у других элементов тоже. Мне кажется проблема в этом и поэтому я не могу добавить элемент в избранное. Подскажите пожалуйста где у меня ошибка?
P.S. Должно работать так. При загрузке списка проверяется id и значение переменной favorites и если favorites = true, то иконка меняется и добавляется в избранное и наоборот.
Вот адаптер BludasAdapter
public class BludasAdapter extends RecyclerView.Adapter<BludasAdapter.BludasViewHolder> implements Filterable {
Context context;
private ArrayList<Bludo> bludoArrayList;
private ArrayList<Bludo> mFilteredList;
private ItemSendId itemSendId;
private boolean favorites;
private int id;
OnItemClickListener mItemClickListener;
public interface OnItemClickListener {
void onFavoriteButtonClick(int id, boolean isFavorite);
}
public void setOnItemClickListener(final OnItemClickListener mItemClickListener) {
this.mItemClickListener = mItemClickListener;
}
public class BludasViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public RoundedImageView imgView;
public TextView txtName;
public TextView txtIngredients;
public ImageButton btnFavorite;
public BludasViewHolder(View view) {
super(view);
itemView.setOnClickListener(this);
imgView = (RoundedImageView) view.findViewById(R.id.imgView);
txtName = (TextView) view.findViewById(R.id.txtName);
txtIngredients = (TextView) view.findViewById(R.id.txtIngredients);
btnFavorite = (ImageButton) view.findViewById(R.id.btnFavorite);
btnFavorite.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnFavorite:
mItemClickListener.onFavoriteButtonClick(id, favorites);
break;
default:
if (itemSendId != null){
itemSendId.sendItemId(mFilteredList.get(getAdapterPosition()).getId());
}
}
}
}
public void setItemSendId(ItemSendId itemSendId) {
this.itemSendId = itemSendId;
}
public BludasAdapter(Context context, ArrayList<Bludo> bludoArrayList) {
this.context = context;
this.bludoArrayList = bludoArrayList;
this.mFilteredList = bludoArrayList;
}
@Override
public BludasViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new BludasViewHolder(itemView);
}
@Override
public void onBindViewHolder(BludasViewHolder holder, final int position) {
final Bludo bludo = mFilteredList.get(position);
holder.txtName.setText(bludo.getName());
holder.txtIngredients.setText(bludo.getIngredients());
favorites = bludo.isFavorite();
id = bludo.getId();
Log.d("ID = ", id + "");
Log.d("isFavorite = ", favorites + "");
if (favorites) {
holder.btnFavorite.setImageResource(R.drawable.ic_favorite_yellow);
} else {
holder.btnFavorite.setImageResource(R.drawable.ic_favorite_black);
}
Glide.with(context).load(Uri.parse("file:///android_asset/img/" + bludo.getImage() + ".png")).into(holder.imgView);
}
@Override
public int getItemCount() {
return mFilteredList.size();
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
mFilteredList = bludoArrayList;
} else {
ArrayList<Bludo> filteredList = new ArrayList<>();
for (Bludo bludo : bludoArrayList) {
if (bludo.getName().toLowerCase().contains(charString)) {
filteredList.add(bludo);
}
}
mFilteredList = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = mFilteredList;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
mFilteredList = (ArrayList<Bludo>) filterResults.values;
notifyDataSetChanged();
}
};
}
}
Вот код фрагмента TabFragment1
public class TabFragment1 extends Fragment implements ItemSendId, BludasAdapter.OnItemClickListener {
private ArrayList<Bludo> bludoArrayList = new ArrayList<>();
private RecyclerView rvList;
private BludasAdapter bludasAdapter;
DBHelper db;
/*AdRequest adRequesti;
private InterstitialAd adMob;*/
@Override
public void onStart() {
super.onStart();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
db = new DBHelper(getContext());
prepareBludasData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_fragment_1, container, false);
rvList = (RecyclerView) view.findViewById(R.id.rvList_bluda);
bludasAdapter = new BludasAdapter(getContext(), bludoArrayList);
bludasAdapter.setItemSendId(this);
bludasAdapter.setOnItemClickListener(this);
rvList.setLayoutManager(new GridLayoutManager(getContext(), 1));
rvList.setItemAnimator(new DefaultItemAnimator());
rvList.setAdapter(bludasAdapter);
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.search_menu, menu);
MenuItem search = menu.findItem(R.id.search);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(search);
search(searchView);
}
@Override
public void sendItemId(int id) {
Intent intent = new Intent(getContext(), BludoActivity.class);
intent.putExtra("id", id);
startActivity(intent);
}
@Override
public void onFavoriteButtonClick(int id, boolean isFavorite) {
String table;
String fav;
String toast;
table = DBContract.Entry.TABLE_BLUDA;
Log.d("isFavorite = ", isFavorite + "");
Log.d("id = ", id + "");
if (isFavorite) {
fav = "0";
toast = "Удалено из избранного";
} else {
fav = "1";
toast = "Добавлено в избранное";
}
ContentValues values = new ContentValues();
values.put(DBContract.Entry.COLUMN_FAVORITE, fav);
long newRowId = db.database.update(table, values, DBContract.Entry._ID + "= " + id, null);
if (newRowId == -1) {
Toast.makeText(getContext(), "Ошибка", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getContext(), toast, Toast.LENGTH_SHORT).show();
}
}
public void search(SearchView searchView) {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (bludasAdapter != null) bludasAdapter.getFilter().filter(newText);
return true;
}
});
}
private void prepareBludasData() {
Cursor cursor = db.getBludassByCategory(1);
try {
if (cursor.getCount() != 0) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(DBContract.Entry._ID));
String name = cursor.getString(cursor.getColumnIndex(DBContract.Entry.COLUMN_NAME));
String ingridients = cursor.getString(cursor.getColumnIndex(DBContract.Entry.COLUMN_INGREDIENTS));
String icon = cursor.getString(cursor.getColumnIndex(DBContract.Entry.COLUMN_IMAGE));
String favorites = cursor.getString(cursor.getColumnIndex(DBContract.Entry.COLUMN_FAVORITE));
bludoArrayList.add(new Bludo(id, name, ingridients, icon, favorites));
}
}
} catch (SQLException ex) {
ex.printStackTrace();
} finally {
cursor.close();
}
}
}