如何在 Activity 之前调用适配器 class

How to Call Adapter class before Activity

Log 说:

D/CartActivity-onCreate(18171): onCreate
D/CartActivity-TOTAL-InsideFORLOOP:(18171): 0.0
D/CartActivity-onResume(18171): onResume
D/CartAdapter-TOTAL:(18171): 12.95

在上面的日志中可以看到for循环首先在CartActivity中执行,在CartActivity的onResume()方法执行之后,CartAdapter 正在执行这一行,因此我得到 0.0 作为 Total in CartActivity inside For loop 的值]

原因不是我添加到数据 ArrayList 的位置,问题是 CartActivityCartAdapter 之前执行 (where i am getting value for Total)执行 (where i am setting value for Total)

那么我必须做的是,如果我 想在执行 CartActivity[=45= 的 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;
}

}

您将要将您的列表填充移动到 onResume() 并且最好将您的列表存储在 onSaveInstanceState() 的 outstate 包中,然后检查它是否存在以在 onCreate() 中重新填充您的列表的 savedInstanceState 包。这与你的问题间接相关 ;) 我知道,但是如果你将列表的人口和显示移动到 onResume() 你会想要也做那些事情所以你不会重复你可能的工作已经完成了。

此外,将 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));
    }
}

该值不会自动反映。你必须调用 adapter.notifyDataSetChanged();更新数据集后。

使用以下代码

_ListAdapter.notifyDataSetChanged();

根据你的第一句话我不确定,因为你在那里说你在转到 CartActivity 之前添加了一个项目。我有点怀疑,或者你那里有并发问题。

如果您的第一句话是正确的,您添加购物车条目的 onClick 可能在您的 onCreate 方法运行后 被调用,这意味着您只有在打开 CartActivity 时才能看到它第二次.

最大的问题是您调用 add 的时间。

在Adapter中设置数组列表之前,只需要在entity中计算Total值,而不是在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);   

希望对你有帮助ツ