2013-07-02 11 views
5

Staram się lista elementów pokazać wraz z GrandTotal kwoty, ale gdy używam tego kodu w moim kodu coraz NullPointerException, patrz poniżej tego kodu:Jak przekazywać wartości z adapterem do działalności

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

szczególnie, gdy używam te linie się błąd:

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

próbowałem z kodem poniżej:

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

i uzyskanie stałych jest większe niż 0, a pokazanie liczby pozycji w Koszyku to 1 , ale ilekroć używam tej linii w moim kodzie, otrzymuję problem, czy jest to właściwy sposób na uzyskanie wartości z adaptera do aktywności?

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

Właściwie jestem obliczaniu całkowitej kwoty każdego i każdy element w klasie adapter i teraz stara się pokazać sumę wszystkich łączną kwotę jako sumy całkowitej aktywności, ale w obliczu problemu, powiedz mi, gdzie robię błąd?

Oto kompletny kod:

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

która linia numer-54 w CartActivity –

+0

@sunil hello jak napisałem powyżej: mGTotal = mGTotal + Double.parseDouble (Constants.sItem_Detail.get (i) .get (com.example.sample.CartAdapter.KEY_TOTAL)) ; – Sneha

+0

@Sneha sprawdź to pytanie http://stackoverflow.com/questions/15286456/android-app-stopped-when-try-to-fetch-data-from-internet – Navi

Odpowiedz

0

Problem z tą linią kodu polega na tym, że masz tam wiele połączeń, w których jedna funkcja zwraca wartość null. Powinieneś podzielić to tak:

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

Więc szybciej znajdziesz swój problem. Przy okazji należy również sprawdzić w każdym wierszu, czy wartość jest pusta.

Należy również pamiętać, że longVar = longVar + longValue można uprościć do longVar += longValue.

14

(1) Jest jeden sposób, aby przekazać wartość z adapterem do aktywności na którym adapter jest ustawiony,

tj piszemy listview.setadapter (xyzadapter); w MainActivity, a my chcemy przekazać wartość z xyzadapter do MainActivity, to tylko jeden sposób, jaki znam, utworzyć jeden interfejs, zdefiniować jedną z tych metod z parametrami do przekazywania wartości, a następnie zaimplementować go na klasie adaptera,

(2) Jeśli chcemy przekazać wartości z adaptera do innego działania, w którym nie jest ono ustawione, możemy użyć metody putExtra do przekazania wartości,

Daj mi znać, jeśli masz jakiś problem ...

Zmieniano: dla (1) odpowiedź

zrobić jeden interfejs w głównym opakowaniu:

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

w adapter klasa make obiektu Interface:

poniżej tej linii publicznej klasy CartAdapter rozszerza BaseAdapter { i przed konstruktorem:

DataTransferInterface dtInterface; 

w swojej budowie przejść ten interfejs

w CartAdapter użyć tego konstruktora:

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

i używać dtInterface.setValues ​​(swoje wartości do przekazania do aktywności)

teraz w Twoich CartActivity.java

implementuj interfejs podobny do:

public class CartActivity extends Activity implements DataTransferInterface { 

i zmienić

mViewCartAdpt = new CartAdapter(CartActivity.this); 

do

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

teraz widać czerwoną linię poniżej CartActivity (wystarczy przesunąć kursor myszy na CartActivity), który pokazuje dodać metody niewykonane, kliknij na który zastąpi setValues metoda

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

} 

możesz użyć Dowolnego rodzaju danych do przekazania zamiast ArrayList

Daj mi znać, jeśli masz jakieś ussue:

+0

Próbowałem już kilka razy, ale z twoim pomysłem myślę, że masz rację, użyj mojego powyższego kodu i pokaż mi, w jaki sposób mogę osiągnąć mój cel? – Sneha

+0

@Sneha: sprawdź poprawioną odpowiedź – Jayesh

+0

Doskonałe rozwiązanie. Pracował jak wdzięk – ChandrasekarG

1

Używaj współdzielonej preferance aby pobrać dane z adapterem do aktywności

0

Jest jeszcze jeden sposób.

Możesz przekazać viewID lub view object w swoim konstruktorze i ustawić zaktualizowaną wartość z adaptera.

Będzie działać w 100%. To działało dla mnie.

+0

@matsjoyce czemu nie? – Alfabravo

+0

@Alfabravo Wyglądało to jak komentarz przed edycją. Teraz jest dobrze. – matsjoyce

0

Ich jest jednym ze sposobów, których użyłem, Mam zdefiniowaną statyczną tablicę w mojej klasie i dostęp do tej tablicy z klasy adaptera. Dlatego zawsze, gdy ich wartość zmienia się w adapterze, moje wartości na liście są odzwierciedlane w samej Klasie.

Powiązane problemy