Log
说:
D/CartActivity-onCreate(18171): onCreate
D/CartActivity-TOTAL-InsideFORLOOP:(18171): 0.0
D/CartActivity-onResume(18171): onResume
D/CartAdapter-TOTAL:(18171): 12.95
正如您在上面看到的,Log for循环首先在CartActivity中执行,在执行CartActivity的onResume()
方法后, CartAdapter 正在执行此行因此,我在Total
For loop
原因不在于我添加数据ArrayList,问题是 CartActivity 在 CartAdapter 执行(where i am getting value for Total
)之前执行(where i am setting value for Total
)
所以我需要做的是,如果我想在 CartActivity
的onCreate()
方法执行之前打电话
CartArrayList.cartArraylist.get(position).setTotal(totalPrice);
CartActivity.java:
public class CartActivity extends Activity {
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("CartActivity-onCreate", "onCreate");
setContentView(R.layout.activity_cart);
.......
adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist);
for (int d = 0; d < CartArrayList.cartArraylist.size(); d++) {
subTotal = subTotal + CartArrayList.cartArraylist.get(d).getTotal();
Log.d("CartActivity-TOTAL-InsideFORLOOP:", String.valueOf(CartArrayList.cartArraylist.get(d).getTotal()));
}
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
textSubTotal.setText(decimalFormat.format(subTotal));
}
@Override
public void onResume() {
super.onResume();
Log.d("CartActivity-onResume", "onResume");
}
}
CartAdapter.java:
public class CartAdapter extends BaseAdapter {
.....
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
......
totalPrice = cart.getQuantity() * cart.getPrice();
CartArrayList.cartArraylist.get(position).setTotal(totalPrice);
Log.d("CartAdapter-TOTAL:", String.valueOf(CartArrayList.cartArraylist.get(position).getTotal()));
.....
return convertView;
}
}
答案 0 :(得分:3)
您必须在适配器中设置数组列表之前计算实体中的总值,而不是在getView
中计算它。
for (int d=0; d<CartArrayList.cartArraylist.size(); d++) {
// calculate total value
Double totalPrice = CartArrayList.cartArraylist.get(d).getQuantity() * CartArrayList.cartArraylist.get(d).getPrice();
CartArrayList.cartArraylist.get(d).setTotal(totalPrice);
// set it for subTotal
subTotal = subTotal + totalPrice;
}
adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist);
listview.setAdapter(adapter);
希望它有助于ツ
答案 1 :(得分:0)
您想要将列表填充移动到onResume(),并且最好将列表存储在onSaveInstanceState()的outstate包中,然后检查它是否存在于在onCreate()的savedInstanceState包中重新填充您的列表。这与您的问题间接相关;)我知道,但是如果您将人口和列表的显示移动到onResume(),那么您也会想要做这些事情,以便您#&# 39;不要重复你可能已经完成的工作。
另外,将notifyDataSetChanged()移到更新数据的地点之后。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_cart);
listview = (ListView)findViewById(R.id.listCart);
if (adapter == null) {
adapter = new CartAdapter(getApplicationContext(), R.layout.adapter_cart, CartArrayList.cartArraylist);
}
listview.setAdapter(adapter);
if (savedInstanceState != null) {
CartArrayList.cartArrayList = savedInstanceState.getParcelableArrayList(KEY_BUNDLE_CART_LIST);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putParcelableArrayList(KEY_BUNDLE_CART_LIST, CartArrayList.cartArrayList);
super.onSaveInstanceState(outState);
}
@Override
public void onResume() {
super.onResume();
if (CartArrayList.cartArrayList.isEmpty()) {
// Update your cartArrayList here if necessary
}
adapter.notifyDataSetChanged();
for(int d=0; d<CartArrayList.cartArraylist.size(); d++) {
subTotal = subTotal + CartArrayList.cartArraylist.get(d).getTotal();
Log.d("NAME:", CartArrayList.cartArraylist.get(d).getName().toString());
Log.d("QUANTITY:", String.valueOf(CartArrayList.cartArraylist.get(d).getQuantity()));
Log.d("PRICE:", String.valueOf(CartArrayList.cartArraylist.get(d).getPrice()));
Log.d("TOTAL:", String.valueOf(CartArrayList.cartArraylist.get(d).getTotal()));
Log.d("SUM:", String.valueOf(subTotal));
}
}
答案 2 :(得分:0)
使用以下代码
{{1}}
答案 3 :(得分:0)
根据你的第一句话,我不确定,因为你在那里说你在去CartActivity之前添加了一个项目。我有点怀疑,或者你有并发问题。
如果您的第一句话为真,那么添加购物车条目的onClick可能在运行onCreate方法后被称为,这意味着只有在第二次打开CartActivity时才能看到它。
最大的问题是添加电话的时间。
答案 4 :(得分:-2)
该值不会自动反映。你必须调用adapter.notifyDataSetChanged();更新数据集后。