محاسبه کل قیمت ها در سبد خرید
سلام خدمت دوستان :
من سبد خریدی دارم که داخلش آیتم های لیست ویو رو می خوام بگیرم و قیمت ها رو جمع ببندم و نشون بدم. داخل هر آیتم لیست ویو هم یه اسپینر هست که تعداد هر محصول رو می تونه انتخاب کنه مشتری.
حالا می خوام مثلا ۲ تا آیتم اومد از سرور بیاد بر اساس تعداد اسپینر جمع کل قیمت رو به من بده .
باید چطوری این کار رو بکنم . لطفا راهنمایی کنید . داخل ادپتر در متود fill چه کارای باید انجام بشه؟
این کد ها : که finalPrice قیمت کل هر آیتم هستش .
public void fill(final ArrayAdapter<StructShoppingBag> adapter, final StructShoppingBag item, final int position) { String CURRENCY = " تومان"; String finalPrice1 = Long.toString(item.finalPrice) + CURRENCY; txtFinalPrice.setText(finalPrice1); ArrayList<String> a = new ArrayList<>(); for (int i = 1; i <= item.inventory; i++) { a.add(String.valueOf(i)); } ArrayAdapter<String> dataAdapter1 = new ArrayAdapter<String>(AdapterShoppingBag, R.layout.spinner_layout, a); dataAdapter1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerCount.setAdapter(dataAdapter1); spinnerCount.setSelection(item.count - 1); //change item in Spinner spinnerCount.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Spinner spinner = (Spinner) v; item.count = Integer.parseInt(spinner.getSelectedItem().toString()); spinnerCount.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View view, int position, long id) { item.count = Integer.parseInt(spinnerCount.getSelectedItem().toString()); //update counter in Spinner pd = ProgressDialog.show(AdapterShoppingBag, null, "لطفا صبر کنید..."); Thread thread = new Thread(new Runnable() { Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pd.dismiss(); switch (res) { case "OkUpdateCount": spinnerCount.setOnItemSelectedListener(null); res = ""; break; case "NoUpdateCount": Toast.makeText(AdapterShoppingBag, "خطا در بروزرسانی تعداد محصول", Toast.LENGTH_SHORT).show(); res = ""; break; default: Toast.makeText(G.context, "خطا در انجام عملیات", Toast.LENGTH_SHORT).show(); break; } super.handleMessage(msg); } }; @Override public void run() { try { Message msg = new Message(); CartHelper.updateCount(item.id, item.count, G.sp.getString("mobile", "")); handler.sendMessage(msg); } catch (Exception e) { Log.e("LOG", e.getMessage()); } } }); thread.start(); } @Override public void onNothingSelected(AdapterView<?> parentView) { } }); return false; } });
}
خوب این کل قیمت همه آیتم های لیست ویو رو در آوردم حالا چطوری با عوض شدن شماره اسپینر هر آیتم درستش کنم؟
int pPrice =0; for(int i=0;i<G.shopping.size();i++){ pPrice = pPrice + G.shopping.get(i).finalPrice; }
منظورم اینه داخل این if ها چی بنویسم که وقتی عدد کم یا زیاد میشه تشخیص بده ؟
if(){ //if count spinner -- int tempM = item.count;
tempM++; item.totalPrice = item.totalPrice / tempM; }else if ( ) { //if count spinner ++ item.totalPrice = item.count * item.totalPrice; }
حالا می خوام مثلا ۲ تا آیتم اومد از سرور بیاد بر اساس تعداد اسپینر جمع کل قیمت رو به من بده .
با روش های مختلفی میشه این کار رو کرد ، مثلا شما میخواید وقتی کاربر داره تعداد هر ایتم روی لیست ویو رو کم و زیاد میکنه قیمت تغییر کنه ؟ و یا بعد از اینکه تعداد مشخص شد و با کلیک کردن روی تایید قیمت محاسبه بشه ؟ قیمت توی یک اکتیوتی دیگه نمایش داده میشه ؟ و یا در یک View بالای لیست ویو و . . .
اولین چیزی که باید بهش دقت کنید این آرایه هست <
private ArrayList<StructValues> arrayStructList = new ArrayList<StructValues>();
چون شما میتونید با استفاده از اون تعداد لیست آیتم های لیست ویو رو بدونید و همچنین مقادیر اولیه هر ایتم که قیمت ها رو به شما میده
یکی از روش های کار میتونه به این شکل باشه که شما یک آرایه از نوع SparseArray بسازید و در adapter مربوط به لیست ویو داشته باشید :
این آرایه بر اساس KEY , VALUE ساخته میشه بنابر این شما میتونید positon هر ایتم از لیست رو بدون اینکه تکراری صورت بگیره درون این آرایه قرار بدید < مقدار position میشه کلید و تعدادی که کاربر برای هر ایتم انتخاب کرده میشه Value که باید از View خودتون getText کنید
این ارایه دوجا باید استفاده بشه یک بار در متد fill < یکبار زمانی که کاربر تعداد رو تغییر میده ، شما این آرایه رو هربار که متد fill صدا زده میشه باید پر کنید و مقدار پیش فرض با توجه به شرایط شما فک میکنم میتونه 0 و یا 1 باشه ، وقتی کاربر تعداد هر لیست رو افزایش یا کاهش میده شما position اون ایتم رو دارید به عنوان KEY بگیرید و تعداد انتخاب شده رو Value در نظر بگیرید و وارد آرایه کنید
fill(){ SparseArray.add(position,txtValue.gettext().toInteger());
spinetItem.onClickListener(){
SparseArray.add(position,txtValue.gettext().toInteger());
} }
بعد از اتمام کار توسط کاربر با استفاده از یک لیستنر این آرایه رو بفرستید جایی که به آرایه زیر هم دسترسی داشته باشید
private ArrayList<StructValues> arrayStructList = new ArrayList<StructValues>();
شما توی آرایه بالا قیمت هر ایتم رو دارید و توی آرایه ایی که با استفاده از SparseArray ساخته شده تعداد هر ایتم رو دارید
size هر دو آرایه برابر هست ، بنابر این کافیه index ایتم هارو بگیرید در یک دیگر ضرب کنید و به در هر بار ضرب مقدار رو جمع کنید
arrayStructList;
SparseArray;
float price = 0;
For(in = 0 to SparseArray.size i++){
price += SparseArray.get(i) * arrayStructList.get(i).price;
}
criss عزیز ممنون که وقت گذاشتی . من با پایین بالا کردن کد ها اومدم برای عوض شدن تعداد اسپینر وقتی اسپینر عوض میشه و پاسخ OkUpdateCount میاد اونجا عدد اسپینر رو می گیرم و ضرب قیمت محصول که در سرور تعریف شده می کنم. و میریزم تو قیمت محصول که می خوام نمایش بدم .
الان اسپینر رو هر عددی بدم درست هستش و قیمت نهایی رو میده.
مشکل آخر این میمونه که من TextView که در کلاس لیست ویو هستش رو static کردم و در ادپتر گرفتمش . که می دونم اشتباه هست کارم و بعضی وقت ها نمایش نمیده. همین تیکه رو بایستی چکار کنم؟ view قیمت آیتم ها در بالای لیست ویو نمایش داده میشه. شبیه به دیجی کالا
//get Items price long pPrice = 0; for (int i = 0; i < G.shopping.size(); i++) { pPrice += G.shopping.get(i).finalPrice; } //change price in TextView String f = Long.toString(pPrice) + CURRENCY; ShoppingBag.totalShopping.setText(f); //change item in Spinner spinnerCount.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Spinner spinner = (Spinner) v; item.count = Integer.parseInt(spinner.getSelectedItem().toString()); spinnerCount.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View view, int position, final long id) { item.count = Integer.parseInt(spinnerCount.getSelectedItem().toString()); //update counter in Spinner pd = ProgressDialog.show(AdapterShoppingBag, null, "لطفا صبر کنید..."); Thread thread = new Thread(new Runnable() { Handler handler = new Handler() { @Override public void handleMessage(Message msg) { pd.dismiss(); switch (res) { case "OkUpdateCount": //mohasebe tedad mahsol va gheymat item.totalPrice = item.count * item.totalPrice_server; // ex: 1000 = 1 * 1000 //mohasebe tedad mahsol va takhfif item.discount = item.count * item.discount_server; // ex: 100 = 1 * 100 // mohasebe takhfif. item.total = item.totalPrice - item.discount; // ex: 900 = 1000 - 100 // mohasebe arzesh afzodeh. item.vat = item.total * item.vat_server / 100; // ex: 81 = 900 * 9 / 100 // mohasebe gheymate nahai. item.finalPrice = item.total * item.vat_server / 100 + item.total; // ex: 981 = 900 * 9 / 100 + 900 adapter.notifyDataSetChanged(); spinnerCount.setOnItemSelectedListener(null); res = ""; break; case "NoUpdateCount": Toast.makeText(G.context, "خطا در بروزرسانی تعداد محصول", Toast.LENGTH_SHORT).show();
res = ""; break; default: Toast.makeText(G.context, "خطا در انجام عملیات", Toast.LENGTH_SHORT).show(); break; } super.handleMessage(msg); } }; @Override public void run() { try { Message msg = new Message(); CartHelper.updateCount(item.id, item.count, G.sp.getString("mobilee", "")); handler.sendMessage(msg); } catch (Exception e) { Log.e("LOG", e.getMessage()); } } }); thread.start(); } @Override public void onNothingSelected(AdapterView<?> parentView) { } }); return false; } });
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .