public class Cart {
private static Cart instance;

private List<CartItem> items;

private Cart() {
items = new ArrayList<>();
}

public static Cart getInstance() {
if (instance == null) {
instance = new Cart();
}
return instance;
}

public void addItem(Product product) {
for (CartItem item : items) {
if (item.getProduct().equals(product)) {
item.setQuantity(item.getQuantity() + 1);
return;
}
}
items.add(new CartItem(product, 1));
}

public void updateItem(CartItem item, int newQuantity) {
if (newQuantity <= 0) {
removeItem(item);
} else {
item.setQuantity(newQuantity);
}
}

public void removeItem(CartItem item) {
items.remove(item);
}

public List<CartItem> getItems() {
return items;
}

public void clear() {
items.clear();
}

public double getTotalPrice() {
double totalPrice = 0;
for (CartItem item : items) {
totalPrice += item.getTotalPrice();
}
return totalPrice;
}
}

Теперь, когда все классы и фрагменты созданы, можем перейти к отображению корзины на экране. Например, можно добавить кнопку «Корзина» на главный экран (MainActivity) и открывать фрагмент CartFragment при ее нажатии.

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Button cartButton = findViewById(R.id.cart_button);
cartButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showCartFragment();
}
});
}

private void showCartFragment() {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
CartFragment cartFragment = new CartFragment();
transaction.replace(android.R.id.content, cartFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}

Здесь мы получаем кнопку из макета и устанавливаем для нее обработчик нажатия. При нажатии вызываем метод showCartFragment, который открывает фрагмент CartFragment. Обрати внимание на то, что транзакцию фрагментов нужно добавить в бэкстек, чтобы пользователь мог вернуться к предыдущему фрагменту.

Вот и всё! Теперь у тебя есть рабочая корзина в приложении, а пользователи могут легко добавлять товары в неё и оформлять заказы. Успехов!
Добавь весь необходимы xml и укажи что в нем должно быть
Конечно, вот xml-разметки для фрагментов и элементов UI:

1. fragment_products.xml - разметка для фрагмента с товарами:

<androidx.recyclerview.widget.RecyclerView
android:id=“@+id/products_recycler_view”
android:layout_width=“match_parent”
android:layout_height=“match_parent” />

Здесь мы используем RecyclerView для отображения списка товаров.

2. item_product.xml - элемент списка товаров:

<LinearLayout
android:orientation=“horizontal”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:padding=“16dp”>

<ImageView
android:id=“@+id/product_image_view”
android:layout_width=“80dp”
android:layout_height=“80dp”
android:src=“@drawable/default_product_image”/>

<LinearLayout
android:orientation=“vertical”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”
android:paddingHorizontal=“16dp”>

<TextView
android:id=“@+id/product_name_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“16sp”
android:textStyle=“bold”
android:text=“Product Name”/>

<TextView
android:id=“@+id/product_description_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“14sp”
android:text=“Product Description”/>

<TextView
android:id=“@+id/product_price_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“14sp”
android:textColor=“@color/colorAccent”
android:text=“Price: $9.99”/>

<RatingBar
android:id=“@+id/product_rating_bar”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:numStars=“5”
android:rating=“0.0”
android:stepSize=“0.5”/>

</LinearLayout>

<Button
android:id=“@+id/add_to_cart_button”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Add to Cart”/>

</LinearLayout>

Здесь мы используем LinearLayout для отображения информации о товаре (название, описание, стоимость и рейтинг) и кнопку для добавления товара в корзину.

3. fragment_cart.xml - разметка для фрагмента с корзиной:

<TextView
android:id=“@+id/total_price_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“20sp”
android:textColor=“@color/colorAccent”
android:text=“Total price: $0.00”
android:padding=“16dp”/>

<Button
android:id=“@+id/place_order_button”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“Place Order”
android:layout_margin=“16dp”/>

<androidx.recyclerview.widget.RecyclerView
android:id=“@+id/cart_recycler_view”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:padding=“16dp” />

Здесь мы отображаем общую стоимость корзины, кнопку для оформления заказа и список товаров в корзине с помощью RecyclerView.

4. item_cart.xml - элемент списка товаров в корзине:

<LinearLayout
android:orientation=“horizontal”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:padding=“16dp”>

<ImageView
android:id=“@+id/cart_item_image_view”
android:layout_width=“80dp”
android:layout_height=“80dp”
android:src=“@drawable/default_product_image”/>

<LinearLayout
android:orientation=“vertical”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”
android:paddingHorizontal=“16dp”>

<TextView
android:id=“@+id/cart_item_name_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“16sp”
android:textStyle=“bold”
android:text=“Product Name”/>

<TextView
android:id=“@+id/cart_item_price_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“14sp”
android:textColor=“@color/colorAccent”
android:text=“Price: $9.99”/>

<TextView
android:id=“@+id/cart_item_total_price_text_view”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:textSize=“14sp”
android:textColor=“@color/colorPrimary”
android:text=“Total price: $9.99”/>

<LinearLayout
android:orientation=“horizontal”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”>

<Button
android:id=“@+id/cart_item_decrease_button”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“-”/>

<TextView
android:id=“@+id/cart_item_quantity_text_view”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:paddingHorizontal=“8dp”
android:text=“1”/>

<Button
android:id=“@+id/cart_item_increase_button”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“+”/>

</LinearLayout>

</LinearLayout>

<Button
android:id=“@+id/cart_item_remove_button”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:text=“Remove”/>

</LinearLayout>

Здесь мы отображаем информацию о товаре в корзине, его стоимость и обработчики событий для кнопок изменения количества и удаления товара.

Надеюсь, это поможет тебе реализовать корзину в своем приложении.
Cannot resolve symbol ‘@color/colorAccent’
Ошибка “Не удается разрешить символ ‘@color/colorAccent’” возникает, когда вы используете ссылку на цвет, который не был определен в вашем файле ресурсов colors.xml.

Чтобы исправить эту ошибку, нужно убедиться, что вы правильно определили все ваши цвета в colors.xml, находящемся в папке values вашего проекта.

В файле colors.xml должна быть определена палитра цветов, например:

<?xml version=“1.0” encoding=“utf-8”?>
<resources>
<color name=“colorPrimary”>#3F51B5</color>
<color name=“colorPrimaryDark”>#303F9F</color>
<color name=“colorAccent”>#FF4081</color>
</resources>

Здесь определены три цвета: colorPrimary, colorPrimaryDark и colorAccent. Если вы используете данную палитру, то ссылка на colorAccent должна функционировать. Если у вас другая палитра цветов, то необходимо использовать свой цвет, определенный в вашем файле colors.xml.

Надеюсь, это помогло вам решить ошибку.
Ты не реализовал CartAdapter
Правильно, в сообщении я не реализовал класс CartAdapter. Вот, как он должен выглядеть:

public class CartAdapter extends RecyclerView.Adapter<CartAdapter.CartItemViewHolder> {

private List<CartItem> items;
private OnCartItemListener listener;

public CartAdapter(List<CartItem> items, OnCartItemListener listener) {
this.items = items;
this.listener = listener;
}

@NonNull
@Override
public CartItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_cart, parent, false);
return new CartItemViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull CartItemViewHolder holder, int position) {
CartItem item = items.get(position);
holder.bind(item, listener);
}

@Override
public int getItemCount() {
return items.size();
}

public void setItems(List<CartItem> items) {
this.items = items;
notifyDataSetChanged();
}

public class CartItemViewHolder extends RecyclerView.ViewHolder {

private ImageView productImageView;
private TextView productNameTextView;
private TextView productPriceTextView;
private TextView productTotalPriceTextView;
private TextView productQuantityTextView;
private Button decreaseButton;
private Button increaseButton;
private Button removeButton;
private int quantity;

public CartItemViewHolder(@NonNull View itemView) {
super(itemView);

productImageView = itemView.findViewById(R.id.cart_item_image_view);
productNameTextView = itemView.findViewById(R.id.cart_item_name_text_view);
productPriceTextView = itemView.findViewById(R.id.cart_item_price_text_view);
productTotalPriceTextView = itemView.findViewById(R.id.cart_item_total_price_text_view);
productQuantityTextView = itemView.findViewById(R.id.cart_item_quantity_text_view);
decreaseButton = itemView.findViewById(R.id.cart_item_decrease_button);
increaseButton = itemView.findViewById(R.id.cart_item_increase_button);
removeButton = itemView.findViewById(R.id.cart_item_remove_button);
}

public void bind(CartItem item, OnCartItemListener listener) {
Product product = item.getProduct();
quantity = item.getQuantity();

productImageView.setImageResource(product.getImageResource());
productNameTextView.setText(product.getName());
productPriceTextView.setText(itemView.getContext().getString(R.string.product_price, product.getPrice()));
productTotalPriceTextView.setText(itemView.getContext().getString(R.string.cart_item_total_price, item.getTotalPrice()));
productQuantityTextView.setText(String.valueOf(quantity));

decreaseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quantity -= 1;
productQuantityTextView.setText(String.valueOf(quantity));
listener.onQuantityChanged(item
, quantity);
}
});

increaseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quantity += 1;
productQuantityTextView.setText(String.valueOf(quantity));
listener.onQuantityChanged(item, quantity);
}
});

removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onRemoveButtonClick(item);
}
});
}
} (ты не доделал : Cannot resolve symbol ‘OnCartItemListener’)
К сожалению, в сообщении я действительно пропустил реализацию интерфейса OnCartItemListener. Вот, как он должен выглядеть:

public interface OnCartItemListener {
void onQuantityChanged(CartItem item, int newQuantity);
void onRemoveButtonClick(CartItem item);
}(недочеты : Cannot resolve symbol ‘OnProductClickListener’)
Спасибо за замечания! К сожалению, в сообщении я действительно пропустил реализацию интерфейса OnProductClickListener. Вот, как он должен выглядеть:

public interface OnProductClickListener {
void onAddToCartClick(Product product);
} (Недочеты : ‘ProductAdapter(android.content.Context, java.util.List<com.example.myapp_2.List_1.Product>)’ in ‘com.example.myapp_2.List_1.ProductAdapter’ cannot be applied to ‘(java.util.List<com.example.myapp_2.List_1.Product>, anonymous com.example.myapp_2.OnProductClickListener)’)
Спасибо за замечания! В сообщении у меня действительно ошибка в вызове конструктора ProductAdapter. Вот, как он должен выглядеть:

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ProductViewHolder> {

private List<Product> products;
private OnProductClickListener listener;

public ProductAdapter(List<Product> products, OnProductClickListener listener) {
this.products = products;
this.listener = listener;}(недочеты : Cannot resolve symbol ‘CartItemViewHolder’)
Спасибо за замечания! В сообщении я действительно ошибся и написал неверное имя класса. Картинка для CartItemViewHolder должна выглядеть так:

public class CartAdapter extends RecyclerView.Adapter<CartItemViewHolder> {

private List<CartItem> items;
private OnCartItemListener listener;

public CartAdapter(List<CartItem> items, OnCartItemListener listener) {
this.items = items;
this.listener = listener;
}

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

@Override
public void onBindViewHolder(CartItemViewHolder holder, int position) {
CartItem item = items.get(position);
holder.bind(item, listener);
}

@Override
public int getItemCount() {
return items.size();
}

public void setItems(List<CartItem> items) {
this.items = items;
notifyDataSetChanged();
}

public static class CartItemViewHolder extends RecyclerView.ViewHolder {

private ImageView productImageView;
private TextView productNameTextView;
private TextView productPriceTextView;
private TextView productTotalPriceTextView;
private TextView productQuantityTextView;
private Button decreaseButton;
private Button increaseButton;
private Button removeButton;
private int quantity;

public CartItemViewHolder(@NonNull View itemView) {
super(itemView);

productImageView = itemView.findViewById(R.id.cart_item_image_view);
productNameTextView = itemView.findViewById(R.id.cart_item_name_text_view);
productPriceTextView = itemView.findViewById(R.id.cart_item_price_text_view);
productTotalPriceTextView = itemView.findViewById(R.id.cart_item_total_price_text_view);
productQuantityTextView = itemView.findViewById(R.id.cart_item_quantity_text_view);
decreaseButton = itemView.findViewById(R.id.cart_item_decrease_button);
increaseButton = itemView.findViewById(R.id.cart_item_increase_button);
removeButton = itemView.findViewById(R.id.cart_item_remove_button);
}

public void bind(CartItem item, OnCartItemListener listener) {
Product product = item.getProduct();
quantity = item.getQuantity();

productImageView.setImageResource(product.getImageResource());
productNameTextView.setText(product.getName());
productPriceTextView.setText(itemView.getContext().getString(R.string.product_price, product.getPrice()));
productTotalPriceTextView.setText(itemView.getContext().getString(R.string.cart_item_total_price, item.getTotalPrice()));
productQuantityTextView.setText(String.valueOf(quantity));

decreaseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quantity -= 1;
productQuantityTextView.setText(String.valueOf(quantity));
listener.onQuantityChanged(item, quantity);
}
});

increaseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
quantity += 1;
productQuantityTextView.setText(String.valueOf(quantity));
listener.onQuantityChanged(item, quantity);
}
});

removeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onRemoveButtonClick(item);
}
});
}
}(на какую кнопку можно открыть корзину?)