2013-07-02 18 views
5

Tôi cố gắng để hiển thị danh sách các mục cùng với GrandTotal Số tiền, nhưng bất cứ khi nào tôi sử dụng mã này trong mã của tôi nhận được NullPointerException, xem dưới đây mã:Làm thế nào để chuyển giá trị từ Adaptor tới Hoạt động

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); 

Đặc biệt, trong khi tôi sử dụng những dòng nhận Lỗi:

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)); 

tôi đã thử với mã bên dưới:

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(); 
} 

và nhận Hằng số lớn hơn 0 và hiển thị số lượng mục trong giỏ hàng là 1 nhưng bất cứ khi nào tôi sử dụng dòng này trong mã của tôi gặp sự cố, đó có phải là cách phù hợp để nhận giá trị từ bộ điều hợp đến hoạt động không?

Double.parseDouble(Constants.sItem_Detail.get(0).get(com.example.sample.CartAdap‌​‌​ter.KEY_TOTAL)); 

Trên thực tế tôi đang tính toán tổng số tiền của mỗi và mọi mục trong lớp Adaptor và bây giờ cố gắng để hiển thị tổng của tất cả tổng số tiền là tổng lớn trong hoạt động, nhưng phải đối mặt với vấn đề này, cho tôi biết nơi tôi đang làm sai lầm?

Dưới đây là mã hoàn chỉnh:

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 start, 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 
+0

dòng số 54 trong CartActivity –

+0

@sunil xin chào như tôi đã viết ở trên: mGTotal = mGTotal + Double.parseDouble (Constants.sItem_Detail.get (i) .get (com.example.sample.CartAdapter.KEY_TOTAL)) ; – Sneha

+0

@Sneha kiểm tra câu hỏi này http://stackoverflow.com/questions/15286456/android-app-stopped-when-try-to-fetch-data-from-internet – Navi

Trả lời

0

Sự cố với dòng mã đó là bạn có nhiều cuộc gọi yên tĩnh trong đó một hàm trả về giá trị rỗng. Bạn nên chia nó ra như thế này:

SomeType1 detail = Constants.sItem_Detail; 
SomeType2 something = detail.get(i); 
String strValue = something.get(com.example.sample.CartAdapter.KEY_TOTAL); 
mGTotal += Double.parseDouble(strValue); 

Vì vậy, bạn sẽ tìm thấy vấn đề của mình nhanh hơn. Bằng cách này bạn cũng nên kiểm tra trong mỗi dòng nếu giá trị là null.

Cũng xin lưu ý rằng longVar = longVar + longValue có thể được đơn giản hóa thành longVar += longValue.

14

(1) Có một cách để vượt qua giá trị từ Adaptor tới Hoạt động trên đó bộ chuyển đổi được thiết lập,

tức là chúng ta viết listview.setadapter (xyzadapter); trong MainActivity, và chúng ta muốn chuyển giá trị từ xyzadapter đến MainActivity, thì chỉ có một cách tôi biết, tạo một giao diện, xác định một phương thức trong đó với tham số cho giá trị truyền và sau đó triển khai nó trên lớp bộ điều hợp,

(2) Nếu chúng ta muốn chuyển các giá trị từ bộ điều hợp đến một hoạt động khác mà nó không được thiết lập, thì chúng ta có thể sử dụng phương thức putExtra để chuyển giá trị,

Cho tôi biết nếu bạn có bất kỳ vấn đề nào ...

được sửa đổi: cho (1) câu trả lời

làm cho một giao diện trong gói chính của bạn:

public interface DataTransferInterface { 
    public void setValues(ArrayList<?> al); 
} 

trong adapter của bạn lớp làm đối tượng của giao diện:

bên dưới dòng public class này CartAdapter mở rộng BaseAdapter { và trước nhà xây dựng:

DataTransferInterface dtInterface; 

trong xây dựng của bạn vượt qua giao diện này

trong CartAdapter sử dụng constructor này:

public CartAdapter(Activity a, DataTransferInterface dtInterface) { 
    // TODO Auto-generated constructor stub 
    activity = a; 
    this.dtInterface = dtInterface; 
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

và sử dụng dtInterface.setValues ​​(Giá trị của bạn để vượt qua để hoạt động)

Bây giờ trong CartActivity.java của bạn

triển khai giao diện đó như:

public class CartActivity extends Activity implements DataTransferInterface { 

và thay đổi

mViewCartAdpt = new CartAdapter(CartActivity.this); 

để

mViewCartAdpt = new CartAdapter(CartActivity.this, this); 

bây giờ bạn sẽ thấy dòng màu đỏ bên dưới CartActivity (chỉ cần di chuyển con trỏ chuột vào CartActivity) cho thấy thêm các phương pháp chưa thực hiện, bấm vào đó sẽ ghi đè setValues phương thức

@Override 
public void setValues(ArrayList<?> al) { 
    // TODO Auto-generated method stub 

} 

bạn có thể sử dụng Mọi loại dữ liệu để chuyển thay vì ArrayList

Hãy cho tôi biết nếu bạn có bất kỳ ussue:

+0

tôi đã thử nhiều lần, nhưng với khái niệm của bạn tôi nghĩ rằng bạn là đúng, xin vui lòng sử dụng mã trên của tôi và chỉ cho tôi cách làm thế nào tôi có thể đạt được mục tiêu của tôi? – Sneha

+0

@Sneha: vui lòng kiểm tra câu trả lời đã chỉnh sửa của tôi – Jayesh

+0

Giải pháp tuyệt vời. Làm việc như một nét duyên dáng – ChandrasekarG

1

Sử dụng chia sẻ preferance để lấy dữ liệu từ bộ chuyển đổi để hoạt động

0

Có thêm một chiều.

Bạn có thể vượt qua viewID hoặc view object trong hàm tạo và đặt giá trị được cập nhật từ bộ điều hợp.

Nó sẽ hoạt động 100%. Nó đã làm việc cho tôi.

+0

@matsjoyce tại sao không? – Alfabravo

+0

@Alfabravo Nó trông giống như một bình luận trước khi chỉnh sửa. Nó ổn rồi. – matsjoyce

0

Đó là một cách mà tôi đã sử dụng, Tôi đã xác định một mảng tĩnh trong Lớp của mình và truy cập mảng đó từ lớp bộ điều hợp. Do đó bất cứ khi nào họ là một thay đổi giá trị trong Adapter giá trị danh sách của tôi được phản ánh trong chính Class đó.

Các vấn đề liên quan