gpt4 book ai didi

java - 将项目添加到 Collection 夹数据库时更改图标颜色

转载 作者:行者123 更新时间:2023-12-02 02:24:23 26 4
gpt4 key购买 nike

当我单击心形图标时,它会将项目发送到 Collection 夹并且颜色发生变化,但是加载 Activity 时图标恢复正常颜色,但该项目仍在 Collection 夹中。

如何检查该项目是否在 Collection 夹中或不更改图标颜色基于诸如带有数据库室的监听器之类的东西?

这是适配器:-

    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 :-

@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;
}

click heart icon sends item to favorite

item in the favorite

when refreshing the fragment icon back to normal again

item still in the favorite

最佳答案

我可以在上面的代码中看到两个问题,

  1. 当我们添加和删除时,您正在更新数据库,这很好,但是您处理本地 View 引用的方式是错误的。

    原因:因为在您的情况下,不仅如果您转到另一个屏幕并来到它不会工作,如果您滚动更多,如果您有更多项目并返回它也不会工作,因为回收器 View 重用您的 View 您在检查监听器中更新了它,这导致了第二个问题

  2. 在 onBindData 中,您始终应该使用非 Collection 夹图标,因此每当您滚动和 View 重用时,它将仅显示非 Collection 夹图标,您应该检查该项目是否是 Collection 夹,并且应该更新 View

例如,您应该这样做

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
}
}

请根据您的项目修改代码。

关于java - 将项目添加到 Collection 夹数据库时更改图标颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262620/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com