Reputation: 57
when user adds same item in the cart for multiple times it should be add that item only for one time and increase number of quantity of that item but in my case whole item is added for each time.
below is cart activity:
public class CartActivity extends AppCompatActivity implements CartAdapter.OnCartDataChangeListener {
DatabaseHandler helper;
public static List<ProductModel> dbList;
RecyclerView mRecyclerView;
Toolbar toolbar;
Button btnCheckout, btnContinueShopping;
public TextView tvTotalNoOfItems, tvTotalPrice;
String productVaiantId;
String selectedProductId;
private RecyclerView.Adapter mAdapter;
private LinearLayoutManager mLayoutManager;
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
productVaiantId = getIntent().getStringExtra("variant_id");
selectedProductId = getIntent().getStringExtra("product_id");
Bundle extras = getIntent().getExtras();
if (extras != null) {
productVaiantId = extras.getString("variant_id");
selectedProductId = extras.getString("product_id");
}
toolbar = (Toolbar) findViewById(R.id.customToolBar);
setSupportActionBar(toolbar);
setTitle("Check-out");
toolbar.setTitleTextColor(Color.BLACK);
toolbar.setNavigationIcon(R.drawable.ic_arrow_back_black);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onBackPressed();
}
});
helper = new DatabaseHandler(this);
dbList = new ArrayList<ProductModel>();
dbList = helper.getDataFromDB();
mRecyclerView = (RecyclerView) findViewById(R.id.rv_cart_item_list);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
mLayoutManager = new LinearLayoutManager(this) {
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
LinearSmoothScroller smoothScroller = new LinearSmoothScroller(CartActivity.this) {
private static final float SPEED = 300f;// Change this value (default=25f)
@Override
protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
return SPEED / displayMetrics.densityDpi;
}
};
smoothScroller.setTargetPosition(position);
startSmoothScroll(smoothScroller);
}
};
mAdapter = new CartAdapter(this, dbList, this);
tvTotalNoOfItems = (TextView) findViewById(R.id.tvTotalCartItems);
tvTotalPrice = (TextView) findViewById(R.id.tvTotalCartItemsPrice);
tvTotalNoOfItems.setText(dbList.size() + "");
double totalPrice = 0.0;
for (int i = 0; i < dbList.size(); i++) {
totalPrice += Double.parseDouble(dbList.get(i).getPrice());
}
tvTotalPrice.setText("" + totalPrice);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setItemAnimator(new SlideInUpAnimator());
btnContinueShopping = (Button) findViewById(R.id.btnBackToProductActivity);
btnContinueShopping.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent launchCollectionActivity = new Intent(CartActivity.this, CollectionActivity.class);
startActivity(launchCollectionActivity);
finish();
}
});
btnCheckout = (Button) findViewById(R.id.btn_checkout);
btnCheckout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAdapter.getItemCount() == 0){
Toast.makeText(CartActivity.this,"Your cart is empty",Toast.LENGTH_SHORT).show();
}
else {
Intent launchCheckoutActivity = new Intent(CartActivity.this, CheckoutActivity.class);
startActivity(launchCheckoutActivity);
} }
});
}
@Override
public void dataChanged() {
tvTotalNoOfItems.setText(dbList.size() + "");
double totalPrice = 0.0;
for (int i = 0; i < dbList.size(); i++) {
totalPrice += Double.parseDouble(dbList.get(i).getPrice());
}
tvTotalPrice.setText("" + totalPrice);
}
}
below is cart adapter:
public class CartAdapter extends RecyclerView.Adapter<CartAdapter.ViewHolder> {
public interface OnCartDataChangeListener{
public void dataChanged();
}
private OnCartDataChangeListener listener;
private List<ProductView.Data> productData = Collections.emptyList();
static List<ProductModel> productModelList;
static Context context;
DatabaseHandler mDatabaseHandler;
public CartAdapter(Context context, List<ProductModel> dbList, OnCartDataChangeListener listener ){
this.productModelList = new ArrayList<ProductModel>();
this.context = context;
this.productModelList = dbList;
mDatabaseHandler = new DatabaseHandler( context );
this.listener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
Context context = parent.getContext();
LayoutInflater inflater = LayoutInflater.from(context);
// Inflate the custom layout
View cartListView = inflater.inflate(R.layout.list_item_cart, parent, false);
// Return a new holder instance
ViewHolder viewHolder = new ViewHolder(context,cartListView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, final int position) {
holder.tvProductName.setText(productModelList.get(position).getTitle());
holder.tvProductPrice.setText(productModelList.get(position).getPrice());
Glide
.with(context)
.load(productModelList.get(position).getImageUrl())
.placeholder(R.drawable.placeholder_loading)
.into(holder.imgProduct);
holder.tvSize.setText(productModelList.get(position).getSize());
holder.tvProductQuantity.setText(Integer.toString(productModelList.get(position).getQuantity()));
holder.tvColor.setText(productModelList.get(position).getColor());
holder.imgDelete.setClickable(true);
holder.imgDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String idForDelete = String.valueOf(productModelList.get(position).getVariantId());
mDatabaseHandler.deleteARow(idForDelete);
productModelList.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position,productModelList.size());
CartActivity.dbList = productModelList;
listener.dataChanged();
}
});
}
@Override
public int getItemCount() {
return productModelList.size();
}
public void Refresh(ArrayList<ProductModel> datas) {
this.productModelList.clear();
this.productModelList.addAll(datas);
notifyDataSetChanged();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView tvProductName, tvProductPrice, tvProductQuantity, tvColor,
tvSize;
ImageView imgProduct;
ImageButton imgDelete;
Context context;
public ViewHolder(Context mContext, View itemView) {
super(itemView);
this.tvProductName = (TextView) itemView.findViewById(R.id.tv_cart_product_name);
this.tvProductPrice = (TextView) itemView.findViewById(R.id.tv_cart_product_price);
this.tvProductQuantity = (TextView) itemView.findViewById(R.id.tv_cart_product_Quantity);
this.imgProduct = (ImageView) itemView.findViewById(R.id.img_cart_item_product);
this.tvColor = (TextView) itemView.findViewById(R.id.tv_color);
this.tvSize = (TextView) itemView.findViewById(R.id.tv_size);
this.imgDelete = (ImageButton) itemView.findViewById(R.id.img_cart_delete);
// store the context ///
this.context = mContext;
}
}
and this snippet is from previous activity from i get product when addToCart button is pressed:
btn_addToCart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String title = tv_productName.getText().toString();
String price = tv_productPrice.getText().toString();
String status = tv_productStatus.getText().toString();
String imageUrl = productImageList.get(0);
String productColor = String.valueOf(sp_productColor.getSelectedItem());
String productSize = String.valueOf(sp_productSize.getSelectedItem());
String productQuantity = String.valueOf(tv_productQuantity.getText());
final String productId = response.data().node().asProduct().id();
final String variantId = response.data().node().asProduct().variants().edges().get(0).node().id();
// save into database
helper = new DatabaseHandler(ProductDetailActivity.this);
helper.insertIntoDB(variantId, title, price, imageUrl, status, productSize, productQuantity, productColor);
// display snackbar to navigate to cart activity
Snackbar.make(view, R.string.snackbar_text, Snackbar.LENGTH_LONG)
.setAction(R.string.snackbar_action, new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent launchCartActivity = new Intent(ProductDetailActivity.this, CartActivity.class);
// adding the first product and its first variant to the cart
launchCartActivity.putExtra("product_id", productId);
launchCartActivity.putExtra("variant_id", variantId);
startActivity(launchCartActivity);
finish();
}
}).show();
}
});
Upvotes: 0
Views: 4233
Reputation: 330
You should apply check . If the item already exists in the cart then only increase the quantity Try it like this.
private boolean isAlreadyInCart(int targetItemId) {
boolean isAlreadyInCart = false;
for (int i = 0; i < itemIds.length; i++) {
if (targetItemId == itemIds[i]) {
isAlreadyInCart = true;
break;
}
}
return isAlreadyInCart;
}
Now call use this method like this.
if (!isAlreadyInCart(itemId)) {
// TODO: add item to cart
} else {
// TODO: increase quantity
}
Upvotes: 2