我试图显示项目列表以及GrandTotal Amount,但每当我在我的代码中使用此代码获取NullPointerException时,请参阅下面的代码:
if (Constants.sItem_Detail.size() > 0) { Double mGTotal = Double.parseDouble(Constants.sItem_Detail.get(0).get(com.example.sample.CartAdapter.KEY_TOTAL)); for (int i = 1; i < Constants.sItem_Detail.size(); i++) { mGTotal = mGTotal + Double.parseDouble(Constants.sItem_Detail.get(i).get(com.example.sample.CartAdapter.KEY_TOTAL)); } mGrandTotal = String.valueOf(new DecimalFormat("##.#").format(mGTotal)); mTxtViewGrandTotal.setText(mGrandTotal); myTextVeiwGrandTotal.setText(mGrandTotal);
特别是,虽然我使用这些行得到错误:
Double mGTotal = Double.parseDouble(Constants.sItem_Detail.get(0).get(com.example.sample.CartAdapter.KEY_TOTAL)); mGTotal = mGTotal + Double.parseDouble(Constants.sItem_Detail.get(i).get(com.example.sample.CartAdapter.KEY_TOTAL));
我试过以下代码:
if (Constants.sItem_Detail.size() > 0) { Toast.makeText(getApplicationContext(),"Constants is Greater Than 0",Toast.LENGTH_LONG).show(); } else { Toast.makeText(getApplicationContext(),"Constants is Less Than < 0",Toast.LENGTH_LONG).show(); }
并且获取常量大于0,并且显示购物车中的商品数量为1
但每当我在我的代码中使用这一行获得问题时,它是从适配器到活动获取价值的正确方法吗?
Double.parseDouble(Constants.sItem_Detail.get(0).get(com.example.sample.CartAdapter.KEY_TOTAL));
实际上我正在计算Adapter类中每个项目的总金额,现在试图在Activity中显示所有总金额的总和为总计,但面对问题,告诉我我在哪里做错了?
这是完整的代码:
CartActivity.java:
protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_cart); mLstView1 = (ListView) findViewById(R.id.listView1); mTxtViewGrandTotal = (TextView) findViewById(R.id.bill_amount); myTextVeiwGrandTotal =(TextView) findViewById(R.id.mTxtViewGrandTotalValue); mItems = (TextView) findViewById(R.id.total_items); mTax =(TextView) findViewById(R.id.taxes); mDeliveryCharges =(TextView) findViewById(R.id.delivery_charges); mDiscount =(TextView) findViewById(R.id.discount); mPackaging =(TextView) findViewById(R.id.packaging); if (Constants.sItem_Detail.size() > 0) { Double mGTotal = Double.parseDouble(Constants.sItem_Detail.get(0).get(com.example.sample.CartAdapter.KEY_TOTAL)); for (int i = 1; i < Constants.sItem_Detail.size(); i++) { mGTotal = mGTotal + Double.parseDouble(Constants.sItem_Detail.get(i).get(com.example.sample.CartAdapter.KEY_TOTAL)); } mGrandTotal = String.valueOf(new DecimalFormat("##.#").format(mGTotal)); mTxtViewGrandTotal.setText(mGrandTotal); myTextVeiwGrandTotal.setText(mGrandTotal); mTaxes = String.valueOf(mTax); mTax.setText("0"); mDelivery = String.valueOf(mDeliveryCharges); mDeliveryCharges.setText("0"); mTotal = String.valueOf(Constants.sItem_Detail.size()); mItems.setText(mTotal); } mViewCartAdpt = new CartAdapter(CartActivity.this); mLstView1.setAdapter(mViewCartAdpt); mLstView1.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent,View v,final int position,long id) { // } }); } // Called when the activity begins interacting with the user @Override protected void onResume() { super.onResume(); mViewCartAdpt.notifyDataSetChanged(); } }
CartAdapter.java:
public class CartAdapter extends BaseAdapter { public static final String LOG_TAG = "CartAdapter"; public static final String KEY_TITLE = "title"; public static final String KEY_COST = "cost"; public static final String KEY_QTY = "qty"; public static final String KEY_TOTAL = "total"; Activity activity; LayoutInflater inflater; ImageButton mImgBtnDelete; ListView listView; private double itemamount = 0; private int itemquantity = 0; public CartAdapter(Activity a) { // TODO Auto-generated constructor stub activity = a; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public int getCount() { // TODO Auto-generated method stub return Constants.sItem_Detail.size(); } public Object getItem(int position) { // TODO Auto-generated method stub return position; } public long getItemId(int position) { // TODO Auto-generated method stub return position; } public View getView(final int position,View convertView,ViewGroup parent) { // TODO Auto-generated method stub View vi = convertView; if (convertView == null) vi = inflater.inflate(R.layout.listrow_cart,null); // listrow_cart vi.setClickable(true); vi.setFocusable(true); vi.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); mImgBtnDelete = (ImageButton) vi .findViewById(R.id.mImgBtnDelete); mImgBtnDelete.setOnClickListener(new OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub Constants.sItem_Detail.remove(position); notifyDataSetChanged(); Intent mInViewCartRefresh = new Intent(activity,CartActivity.class); activity.startActivity(mInViewCartRefresh); activity.finish(); } }); final TextView title = (TextView) vi.findViewById(R.id.title); final EditText qty = (EditText) vi.findViewById(R.id.qty); final TextView cost = (TextView) vi.findViewById(R.id.cost); final TextView total = (TextView) vi.findViewById(R.id.total); HashMap<String,String> item = new HashMap<String,String>(); item = Constants.sItem_Detail.get(position); // Setting all values in listview title.setText(item.get(com.example.sample.ItemsActivity.KEY_TITLE)); cost.setText(item.get(com.example.sample.ItemsActivity.KEY_COST)); qty.setText("1"); itemquantity = Integer.parseInt(qty.getText().toString()); itemamount = Double.parseDouble(cost.getText().toString()); total.setText(new DecimalFormat("##.#").format(itemamount*itemquantity)); qty.addTextChangedListener(new TextWatcher() { public void onTextChanged(CharSequence s,int start,int before,int count) { // TODO Auto-generated method stub if (!qty.getText().toString().equals("") || !qty.getText().toString().equals("")) { // accept quantity by user itemquantity = Integer.parseInt(qty.getText() .toString()); // changes in total amount as per change in qty (entered by user) total.setText(new DecimalFormat("##.#").format(itemamount*itemquantity)); } else { total.setText("0.00"); } } public void beforeTextChanged(CharSequence s,int count,int after) { // TODO Auto-generated method stub } public void afterTextChanged(Editable s) { } }); return vi; } }
logcat的:
07-02 05:05:29.411: D/AndroidRuntime(802): Shutting down VM 07-02 05:05:29.420: W/dalvikvm(802): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 07-02 05:05:29.501: E/AndroidRuntime(802): FATAL EXCEPTION: main 07-02 05:05:29.501: E/AndroidRuntime(802): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sample/com.example.sample.CartActivity}: java.lang.NullPointerException 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread.access$600(ActivityThread.java:141) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.os.Handler.dispatchMessage(Handler.java:99) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.os.Looper.loop(Looper.java:137) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread.main(ActivityThread.java:5041) 07-02 05:05:29.501: E/AndroidRuntime(802): at java.lang.reflect.Method.invokeNative(Native Method) 07-02 05:05:29.501: E/AndroidRuntime(802): at java.lang.reflect.Method.invoke(Method.java:511) 07-02 05:05:29.501: E/AndroidRuntime(802): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 07-02 05:05:29.501: E/AndroidRuntime(802): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 07-02 05:05:29.501: E/AndroidRuntime(802): at dalvik.system.NativeStart.main(Native Method) 07-02 05:05:29.501: E/AndroidRuntime(802): Caused by: java.lang.NullPointerException 07-02 05:05:29.501: E/AndroidRuntime(802): at java.lang.StringToReal.parseDouble(StringToReal.java:244) 07-02 05:05:29.501: E/AndroidRuntime(802): at java.lang.Double.parseDouble(Double.java:295) 07-02 05:05:29.501: E/AndroidRuntime(802): at com.example.sample.CartActivity.onCreate(CartActivity.java:54) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.Activity.performCreate(Activity.java:5104) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 07-02 05:05:29.501: E/AndroidRuntime(802): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 07-02 05:05:29.501: E/AndroidRuntime(802): ... 11 more 07-02 05:05:33.180: I/Process(802): Sending signal. PID: 802 SIG: 9
解决方法
(1)有一种方法可以将值从Adapter传递给Activity,其中设置了适配器,
即我们写listview.setadapter(xyzadapter);在MainActivity中,我们希望将值从xyzadapter传递给MainActivity,然后只有我知道的一种方法,创建一个接口,用参数传递值定义一个方法,然后在适配器类上实现它,
(2)如果我们想将值从适配器传递给另一个未设置它的活动,那么我们可以使用putExtra方法传递值,
如果您有任何问题,请告诉我……
编辑:for(1)回答
在主包中创建一个界面:
public interface DataTransferInterface { public void setValues(ArrayList<?> al); }
在您的适配器类中创建接口的对象:
公共类CartAdapter扩展BaseAdapter {
在构造函数之前:
DataTransferInterface dtInterface;
在您的构造中传递此接口
在CartAdapter中使用此构造函数:
public CartAdapter(Activity a,DataTransferInterface dtInterface) { // TODO Auto-generated constructor stub activity = a; this.dtInterface = dtInterface; inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); }
并使用dtInterface.setValues(您的值传递给Activity)
现在在你的CartActivity.java中
实现该接口,如:
public class CartActivity extends Activity implements DataTransferInterface {
并改变
mViewCartAdpt = new CartAdapter(CartActivity.this);
至
mViewCartAdpt = new CartAdapter(CartActivity.this,this);
现在你会看到CartActivity下方的红线(只是将鼠标光标移到CartActivity上),显示添加未实现的方法,点击它会覆盖setValues方法
@Override public void setValues(ArrayList<?> al) { // TODO Auto-generated method stub }
您可以使用任何类型的数据来代替ArrayList
如果您有任何问题,请告诉我: