簡體   English   中英

如何計算購物車中的總價?

[英]How do I calculate the total price in the shopping cart?

當用戶按下添加按鈕時,我的應用程序的購物車部分是離線實現的。 產品存儲在數據庫中,然后顯示在購物車中。

我的問題

更改商品編號后如何更改商品價格?(一個編號的總價是從每個商品計算出來的,但更改編號后,總價不變。)

cartadapter.java

public class FacultyAdapter extends RecyclerView.Adapter<FacultyAdapter.FacultyViewHolder> {

dbhandler mydb;
private int counter=1;
private Context context;
private List<Faculty> facultyList;
Faculty faculty ;

public FacultyAdapter(Context context, List<Faculty> facultyList) {
    this.context = context;
    this.facultyList=facultyList;
}

@NonNull
@Override
public FacultyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(context).inflate(R.layout.itemcard,parent,false);
    RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
   ViewGroup.LayoutParams.WRAP_CONTENT);
    view.setLayoutParams(lp);

    return new FacultyViewHolder(view);
}


   /////////////////////////////////////////////////
 @Override
 public void onBindViewHolder(@NonNull final FacultyViewHolder holder,final int position) {

     faculty = facultyList.get(position);
    holder.title.setText(faculty.getName());
   holder.price.setText(faculty.getPrice());
   holder.count.setText(String.valueOf(faculty.getQty()));
   holder.inc.setGravity(Gravity.CENTER);
    String photoname=faculty.getImage();
    Glide
            .with(context)
            .load( Urls.image+photoname)
            .placeholder(R.mipmap.ic_launcher_round)
            .error(R.drawable.logo)
           .into(holder.img);

    mydb=new dbhandler(context);


         //////////////////////////////////
    holder.inc.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {
           int count= Integer.parseInt(String.valueOf(holder.count.getText()));
           count++;
           holder.count.setText(String.valueOf(count));
            faculty.setQty(count);
        Log.d("inc",""+faculty.getQty());
       }
   });
    holder.dec.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int count= Integer.parseInt(String.valueOf(holder.count.getText()));
            if(count>1){
                count--;
                holder.count.setText(String.valueOf(count));
                faculty.setQty(count);
              //  Log.d("dec",""+count);
            }
        }
    });
}
 ///////////////////////////////////
@Override
public int getItemCount() {
    return facultyList.size();
}
 ////////////////////////////////
public class FacultyViewHolder extends RecyclerView.ViewHolder {

    TextView title;
    TextView price,count;
   ImageView img;
    CardView card,viewBackground;

 Button inc,dec;
    private FacultyViewHolder(View itemView) {
        super(itemView);
        title = itemView.findViewById(R.id.txt_list_item_title);
        price = itemView.findViewById(R.id.txt_list_item_des);  
       img=itemView.findViewById(R.id.image_cart);
        inc=itemView.findViewById(R.id.increment);
        dec=itemView.findViewById(R.id.decrement);
        count=itemView.findViewById(R.id.display);
        card =itemView.findViewById(R.id.card);
        viewBackground =itemView.findViewById(R.id.view_background);
    }
}

//////////////////////////////////////////
public void remove(int position){
    final Faculty s = facultyList.get(position);
    facultyList.remove(position);
    String e=s.getId().toString();
    mydb.delete(e);
    notifyItemRemoved(position);
}

}

cartactivity.java

 public class cart extends AppCompatActivity implements 
  RecyclerItemTouchHelper.RecyclerItemTouchHelperListener {
Button Add,total; 
ImageButton back_btn;
Faculty items;
private TextView price_total; 
FacultyAdapter facultyAdapter;
dbhandler mydb;
String name;
 List<Faculty> posts;
String id, title, status, price, image,sum;
@SuppressLint("WrongConstant")
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_cart);

    RecyclerView recyclerView = findViewById(R.id.rv_card);
    Add = findViewById(R.id.btn_basket_pay);
    price_total = findViewById(R.id.totalPrice);
    mydb=new dbhandler(getApplicationContext());
    back_btn=findViewById(R.id.back);
    total=findViewById(R.id.total);

   mydb.open();

    facultyAdapter = new FacultyAdapter(getApplicationContext(), mydb.display());
    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), 
   LinearLayoutManager.VERTICAL, false));
    recyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(facultyAdapter);  

   facultyAdapter.registerAdapterDataObserver(observer);
    posts= mydb.display();

    for (int i= 0; i < posts.size(); i++){
       facultyAdapter.calculateTotalF(i);      
        name=""+posts.get(i).getName();
    }

    items = new Faculty(id,title, status, price, sum);
    SharedPreferences preferences = getSharedPreferences("prefs",MODE_PRIVATE);
    facultyAdapter.notifyDataSetChanged();
    items.setSum(String.valueOf(price_total.getText()));

    //////////////////////////////////
    mydb.close();

    total.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          //  price_total.setText(""+ bundle.getString(qty_dkey));
        }
    });
       ////////////////////////////////////////////////
    back_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(cart.this, MainActivity.class));
            finish();
        }
    });
      //////////////////////////
    ItemTouchHelper.SimpleCallback simpleCallback=new RecyclerItemTouchHelper(0,ItemTouchHelper.LEFT 
   |ItemTouchHelper.RIGHT,this);
    new ItemTouchHelper(simpleCallback).attachToRecyclerView(recyclerView);
    //////////////////////////////////////////////////
    Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           add();
        }
    });
  }
  //////////////////////////////////////////////////////////////////////////
 public int calculateMealTotal(){
 int mealTotal = 0;
for(Faculty order : posts){
    mealTotal +=Integer.parseInt(order.getPrice()) * order.getQty();
    Log.d("qtyad",""+order.getQty());
    Log.d(" mealTotal",""+ mealTotal);
}

return mealTotal;
}

RecyclerView.AdapterDataObserver observer = new RecyclerView.AdapterDataObserver() {
    @Override
    public void onChanged() {
        super.onChanged();
        setMealTotal();
        Log.d("ob","ob");

    }
};
public void setMealTotal(){
    price_total.setText(" "+ calculateMealTotal());
}

在數據庫中顯示

    public List<Faculty> display(){

    SQLiteDatabase db = this.getReadableDatabase();
    String selectQuery = "SELECT  * FROM " + TBL_NAME ;
    Cursor cursor = db.rawQuery(selectQuery, null);

    if (cursor!= null)
        cursor.moveToFirst();
    List<Faculty> facultyList = new ArrayList<>();
    try {
        do{

            Faculty faculty = new Faculty(id,title, status, price, image);
            faculty.setId(cursor.getString(0));
            faculty.setName(cursor.getString(1));
            faculty.setPrice(cursor.getString(3));
            faculty.setQty(cursor.getInt(4));
            faculty.setImage(cursor.getString(2));
            // faculty.setQty(cursor.getString(3));
            facultyList.add(faculty);
        }while (cursor.moveToNext());

    } catch (Exception e) {
        e.printStackTrace();
    }

    return facultyList;
}

你的issue參考object。

您正在 Adapter 中傳遞一個 object 並在 Activity 中使用另一個。

facultyAdapter = new FacultyAdapter(getApplicationContext(), mydb.display()); //one object

並使用相同的數據庫 function 保存在帖子中

 posts= mydb.display(); //creates another object

你可以做的是 shift posts= mydb.display(); 以上適配器分配。

所以你的代碼看起來像

posts= mydb.display();
facultyAdapter = new FacultyAdapter(getApplicationContext(), posts);

現在在添加按鈕 onClickListener 上使用您的setMealTotal()add()

Add.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           add();
           setMealTotal()
        }
});

編輯

要更新總價,您需要更改 FacultyList 以及保存購物車數據的數據庫中的數量值。 當前,您正在適配器 BindViewHolder 上手動更新 UI,不建議這樣做,因為適配器的工作是根據綁定的數據更新 UI。 使用 Recyclerview 檢查 Android Room 或 CursorAdpter 以輕松執行這些任務。

目前您可以做的是創建一個界面來通知您的活動有關購物車中的更改。

interface ICartModification{
  void increment(int qty, Faculty faculty)
  void decrement(int qty, Faculty faculty)
} 

在 CartActivity 上實現這個接口

@Overrides
void increment(int qty, Faculty faculty){
   faculty.setQty(qty)

    //update DB here
   facultyAdapter.notifyDataSetChanged()
   setMealTotal()
}
@Overrides
void decrement(int qty, Faculty faculty){
   if(qty<=0)
      posts.remove(faculty)
   else
      faculty.setQty(qty)

   //update DB here
   facultyAdapter.notifyDataSetChanged()
   setMealTotal()
}

並將 Activity 的引用傳遞給適配器。

facultyAdapter = new FacultyAdapter(this, mydb.display());

現在在您的 Inc 和 Dcr 上調用此更新 function,如下所示

holder.inc.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View v) {

           if(context instanceof ICartModification){
               ((ICartModification)context).increment(faculty.getQty()+1, faculty);
           }
       }
   });

holder.dec.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {

               if(context instanceof ICartModification){
                   ((ICartModification)context).decrement(faculty.getQty()-1, faculty);
               }
           }
       });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM