Изменить цвет значка при добавлении элемента в избранную базу данных

Когда я щелкаю значок сердца, он отправляет элемент в избранное и меняет цвет, но при загрузке активности значок возвращается в нормальное состояние цвет, но деталь все еще в фаворите.

Как я могу проверить, находится ли элемент в избранном или нет, чтобы изменить значок цвет на основе этого что-то вроде слушателя с комнатой базы данных?

Вот адаптер: -

    public class BSAdapter extends RecyclerView.Adapter<BSAdapter.BestSellerHolder> {
    private Context context;
    private List<ProductsBestSeller> bestSellerList;


    public BSAdapter(Context context, List<ProductsBestSeller> bestSellerList) {
        this.context = context;
        this.bestSellerList = bestSellerList;
    }

    @Override
    public BestSellerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View bestSellerView = LayoutInflater.from(parent.getContext()).inflate(R.layout.default_product_items_horizontal, parent, false);
        return new BestSellerHolder(bestSellerView);
    }

    @Override
    public void onBindViewHolder(BestSellerHolder holder, int position) {
        ProductsBestSeller bestSeller = bestSellerList.get(position);
        holder.onBindData(bestSeller);

    }

    @Override
    public int getItemCount() {
        if (bestSellerList != null) {
            return bestSellerList.size();
        } else {
            return 0;
        }
    }

    public class BestSellerHolder extends RecyclerView.ViewHolder {

        TextView productName, productPrice;
        ImageView productIcon;
        CheckBox favouriteIcon;


        public BestSellerHolder(View itemView) {
            super(itemView);
            productIcon = itemView.findViewById(R.id.product_icon_horizontal);
            productName = itemView.findViewById(R.id.product_name_horizontal);
            productPrice = itemView.findViewById(R.id.product_price_horizontal);
            favouriteIcon = itemView.findViewById(R.id.favourite_icon_horizontal);
        }

        private void onBindData(ProductsBestSeller bestSeller) {
            if (Resources.getSystem().getConfiguration().locale.getLanguage().equals(Locale.ENGLISH.toString())) {
                productName.setText(bestSeller.getNameEn());
            } else {
                productName.setText(bestSeller.getNameAr());
            }
            Glide.with(context).load(bestSeller.getImage()).into(productIcon);
            productPrice.setText(String.valueOf(bestSeller.getPrice()));
            ProductsEntities entity = ProductsEntities.getEntityByBestSeller(bestSeller);
            if (entity.getFavourite() == 0){
                favouriteIcon.setButtonDrawable(R.drawable.ic_favorite_black_24dp);
            }else{
                favouriteIcon.setButtonDrawable(R.drawable.favourite_icon);
            }
            favouriteIcon.setOnCheckedChangeListener((buttonView, isChecked) -> {
                if (isChecked) {
                    favouriteIcon.setButtonDrawable(R.drawable.favourite_icon);
                    entity.setFavourite(1);
                    Repository.getRepository().addProductEntity(entity);
                    Toast.makeText(context, R.string.added_to_favourite, Toast.LENGTH_SHORT).show();
                } else {
                    favouriteIcon.setButtonDrawable(R.drawable.ic_favorite_black_24dp);
                    entity.setFavourite(0);
                    Repository.getRepository().addProductEntity(entity);
                    Toast.makeText(context, R.string.deleted_from_favourite, Toast.LENGTH_SHORT).show();

                }
            });
        }
    }
}

Вот база данных комнат Дао: -

@Dao
public interface MercDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void addProduct(ProductsEntities entity);

    @Query("SELECT * FROM product_entity WHERE favourite_product == 1")
    LiveData<List<ProductsEntities>> getFavourites();

    @Query("SELECT * FROM product_entity WHERE cart_product == 1")
    LiveData<List<ProductsEntities>> getCart();

    @Query("UPDATE product_entity SET favourite_product = 1 WHERE product_id == :id")
    void setFavourite(String id);

    @Query("UPDATE product_entity SET cart_product = 1 WHERE product_id == :id")
    void setCart(String id);

    @Query("UPDATE product_entity SET cart_product = 0 WHERE product_id == :id")
    void deleteCart(String id);

    @Query("UPDATE product_entity SET favourite_product = 0 WHERE product_id == :id")
    void deleteFavourite(String id);
}

Вот мой объект базы данных Room: -

@Entity(tableName = "product_entity")
public class ProductsEntities {

    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "product_id")
    private String id;
    @ColumnInfo(name = "product_name_en")
    private String nameEn;
    @ColumnInfo(name = "product_name_ar")
    private String nameAr;
    @ColumnInfo(name = "product_image")
    private String image;
    @ColumnInfo(name = "category_id")
    private String categoryId;
    @ColumnInfo(name = "store_id")
    private String storeId;
    @ColumnInfo(name = "product_price")
    private int price;
    // 1 for Recent ||  2 for BestSeller  ||  3 for CategoryProducts  ||  4 for StoreProducts
    @ColumnInfo(name = "product_type")
    private int product;

    @ColumnInfo(name = "favourite_product")
    private int favourite = 0;

    @ColumnInfo(name = "cart_product")
    private int cart = 0;

    public ProductsEntities() {

    }

    @NonNull
    public String getId() {
        return id;
    }

    public void setId(@NonNull String id) {
        this.id = id;
    }

    public String getNameEn() {
        return nameEn;
    }

    public void setNameEn(String nameEn) {
        this.nameEn = nameEn;
    }

    public String getNameAr() {
        return nameAr;
    }

    public void setNameAr(String nameAr) {
        this.nameAr = nameAr;
    }

    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getCategoryId() {
        return categoryId;
    }

    public void setCategoryId(String categoryId) {
        this.categoryId = categoryId;
    }

    public String getStoreId() {
        return storeId;
    }

    public void setStoreId(String storeId) {
        this.storeId = storeId;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public int getProduct() {
        return product;
    }

    public void setProduct(int product) {
        this.product = product;
    }

    public int getFavourite() {
        return favourite;
    }

    public int getCart() {
        return cart;
    }

    public void setFavourite(int favourite) {
        this.favourite = favourite;
    }

    public void setCart(int cart) {
        this.cart = cart;
    }

щелкните значок сердца, чтобы отправить элемент в избранное

вещь в избранном

при обновлении значка фрагмента снова возвращается к нормальному состоянию

товар до сих пор в избранном

🤔 А знаете ли вы, что...
Java в основном используется для разработки приложений для мобильных устройств и веб-приложений.


1
313
1

Ответ:

Решено

Я вижу 2 проблемы в приведенном выше коде,

  1. Вы обновляете базу данных, когда мы добавляем и удаляем, это нормально, но то, как вы обрабатываете ссылку на локальное представление, неверно.

    Причина: потому что в вашем случае не только если вы перейдете на другой экран и вернетесь, это не сработает, если вы прокрутите больше, если у вас есть больше элементов, и вернетесь, также это не сработает, из-за просмотра recycler повторно использует ваш вид, который вы обновили в прослушивателе проверки, это приводит ко второй проблеме

  2. В onBindData вы всегда должны использовать неизбранный значок, поэтому всякий раз, когда вы прокручиваете и просматриваете повторное использование, он будет отображать только неизбранные значки, вы должны проверить, является ли элемент избранным или нет, и вы должны обновить представление

Например, вы должны сделать, как показано ниже

override fun onBindViewHolder(holder: VM, position: Int) {
    val item = items.get(position)

    if (item.favourite == 0) {
        holder.name.text = item.name
    } else {
        holder.name.text = item.name + " Liked "
    }

    holder.favouriteIcon.setOnCheckedChangeListener { compoundButton, isChecked ->
        // Should not update local view reference here
        if (isChecked) {
            // Update the local reference object, Just not to update from DB
            item.favourite = 1
            // Do the logic to update the DB to add the item in Fav
        } else {
            // Update the local reference object, Just not to update from DB
            item.favourite = 0
            // Do the logic to update to remove the item from Fav list
        }
        notifyItemChanged(position) // Helps to update the particular item
    }
}

Пожалуйста, измените код на основе вашего проекта.