محاسبه کل قیمت ها در سبد خرید
سلام خدمت دوستان :
من سبد خریدی دارم که داخلش آیتم های لیست ویو رو می خوام بگیرم و قیمت ها رو جمع ببندم و نشون بدم. داخل هر آیتم لیست ویو هم یه اسپینر هست که تعداد هر محصول رو می تونه انتخاب کنه مشتری.
حالا می خوام مثلا ۲ تا آیتم اومد از سرور بیاد بر اساس تعداد اسپینر جمع کل قیمت رو به من بده .
باید چطوری این کار رو بکنم . لطفا راهنمایی کنید . داخل ادپتر در متود 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;
}
});
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .