2011-04-02 96 views
0

我想從活動SpinPizza.java傳遞一個ArrayList到Bill.java(使用Parcelable)。如何將Arraylist從第一個活動傳遞到第二個活動?

現在的問題是,在接收活動中,我得到的arraylist是由自己修改的......即。它僅包含最後輸入的值在其所有的指標......我無法理解這背後的原因......我張貼相關的代碼如下: -

SpinPizza.java

public class SpinPizza extends Activity{ 

store temp= new store(); 

    int i=0; 

ArrayList<store> B = new ArrayList<store>(); 

Spinner s=null,s1=null; 

EditText edittext=null; 

@Override 

public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.drop); 

      //spinners n edittext instantiation 

    edittext.setOnKeyListener(new OnKeyListener() { 

     public boolean onKey(View v, int keyCode, KeyEvent event) { 

      // If the event is a key-down event on the "enter" button 

      if ((event.getAction() == KeyEvent.ACTION_DOWN) && 

       (keyCode == KeyEvent.KEYCODE_ENTER || keyCode == KeyEvent.KEYCODE_DPAD_CENTER)) { 

       // Perform action on key press 

     int n=Integer.parseInt(edittext.getText().toString()); 

     temp.setOrder(s.getSelectedItem().toString(), s1.getSelectedItem().toString(),n); 

      B.add(temp); 

       TextView objText=(TextView) findViewById(R.id.pl); 

       TextView objText1=(TextView) findViewById(R.id.pl2); 

       objText.setText(B.get(i).getPizzaName()); 

      objText1.setText(temp.getPizzaSize()); 

       i++; 



       Toast.makeText(SpinPizza.this, edittext.getText(), Toast.LENGTH_SHORT).show(); 

       return true; 

      } 

      return false; 

     } 

    }); 


     Button next1 = (Button) findViewById(R.id.bill); 

     next1.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 


       Intent myIntent = new Intent(view.getContext(), Bill.class); 


        myIntent.putParcelableArrayListExtra("myclass",B); 
           startActivityForResult(myIntent, 0); 

      } 

     }); 

} 

} 

( Bill.java)

public class Bill extends Activity { 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
this.setContentView(R.layout.calc); 
ArrayList<store> B1 = new ArrayList<store>(); 

store temp1=null; 
Intent ii= getIntent(); 

    B1=ii.getParcelableArrayListExtra("myclass"); 


TableLayout tl = (TableLayout)findViewById(R.id.myTable); 

     for(int i=0;i<B1.size();i++) 
     { 
      temp1=new store(); 
      TableRow tr = new TableRow(this); 
      tr.setId(100+i); 
      temp1=B1.get(i);   
      tr.setLayoutParams(new LayoutParams(
          LayoutParams.FILL_PARENT, 
          LayoutParams.WRAP_CONTENT)); 

      TextView b = new TextView(this); 
     b.setText(temp1.getPizzaName()); 
     b.setId(200+i); 

     TextView b1 = new TextView(this); 
     b1.setText(temp1.getPizzaSize()); 
     b1.setId(300+i); 

     TextView b2 = new TextView(this); 
     b2.setText(String.valueOf(temp1.getQuantity())); 
    b2.setId(400+i); 

     b.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 
     tr.addView(b); 

     b1.setLayoutParams(new LayoutParams(
       LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 
     tr.addView(b1); 

     b2.setLayoutParams(new LayoutParams(
       LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     tr.addView(b2);  


/* Add row to TableLayout. */ 
tl.addView(tr,new TableLayout.LayoutParams(
      LayoutParams.FILL_PARENT, 
      LayoutParams.WRAP_CONTENT)); 



}}} 

請幫幫我。

UPDATE

@Flo我試圖通過應用class..But這樣做,現在我m到處空指針異常。

這是(我已經在我得到它的線下自提)我修改過的代碼。

SpinPizza.java - >沒有改變...

MyApp.java

package com.Lak; 

import java.util.ArrayList; 

import android.app.Application; 


public class MyApp extends Application { 

    ArrayList<store> B = null; 

      public ArrayList<store> getState(){ 

      return B; 
      } 

     } 

Bill.java

public class Bill extends Activity { 
    @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

    this.setContentView(R.layout.calc); 
    ArrayList<store> B = new ArrayList<store>(); 

    store temp1=null; 

    MyApp appState = ((MyApp)getApplicationContext()); 
    B = appState.getState(); 



TableLayout tl = (TableLayout)findViewById(R.id.myTable); 
     /* Create a new row to be added. */ 


       /* Create TEXTVIEWS to be the row-content. */ 






      for(int i=0;i<B.size();i++) //NULL POINTER EXCEPTION 
      { 
       temp1=new store(); 
       TableRow tr = new TableRow(this); 
       tr.setId(100+i); 
       temp1=B.get(i);  
       tr.setLayoutParams(new LayoutParams(
           LayoutParams.FILL_PARENT, 
           LayoutParams.WRAP_CONTENT)); 


       TextView b = new TextView(this); 
      b.setText(temp1.getPizzaName()); 
      b.setId(200+i); 


      TextView b1 = new TextView(this); 
      b1.setText(temp1.getPizzaSize()); 
      b1.setId(300+i); 

      TextView b2 = new TextView(this); 
      b2.setText(String.valueOf(temp1.getQuantity())); 
     b2.setId(400+i); 

      b.setLayoutParams(new LayoutParams(
         LayoutParams.FILL_PARENT, 
         LayoutParams.WRAP_CONTENT)); 
      tr.addView(b); 

      b1.setLayoutParams(new LayoutParams(
        LayoutParams.FILL_PARENT, 
        LayoutParams.WRAP_CONTENT)); 
      tr.addView(b1); 


      b2.setLayoutParams(new LayoutParams(
        LayoutParams.WRAP_CONTENT, 
        LayoutParams.WRAP_CONTENT)); 

      tr.addView(b2); 


    /* Add row to TableLayout. */ 
    tl.addView(tr,new TableLayout.LayoutParams(
       LayoutParams.FILL_PARENT, 
       LayoutParams.WRAP_CONTENT)); 

    }}} 

我想申請班級不發送更新的Arraylist ...它只是發送de (定義爲NULL):-(

回答

1

爲什麼不使用singleton類或Application類將列表傳遞給另一個活動。單例或應用程序類可以從應用程序的任何地方訪問。

+0

@Flo:怎麼做?你能舉個例子嗎? – 2011-04-02 16:23:21

+0

創建一個擴展類Application的類。然後,您必須在您的清單文件中將這個類作爲應用程序類註冊。不,您可以在您的活動中調用getApplication(),並且您將始終獲得您實施的應用程序類的相同實例。在這堂課裏你可以做任何你喜歡的事。例如。存儲你的ArrayList,稍後從其他活動中檢索它。 – Flo 2011-04-02 17:45:03

+0

@Flo:好的。所以我想我能做的就是創建這個應用程序類作爲SpinPizza的子類。然後將數組列表存儲在應用程序類中...然後通過getter和setter方法,檢索Bill.java中的數組列表....我希望我得到它..如果我錯了,請糾正我。 – 2011-04-03 05:12:19

2

putParcelableArrayListExtra()方法應具有完全限定類名 - 文件說:

擴展數據添加到意圖。 名稱必須包含包前綴 ,例如應用程序 com.android.contacts將使用名稱爲「com.android.contacts.ShowAll」的名稱 。

請問您的store類(btw類名應該以大寫字母開頭)是否實現Parcelable?這是合同的一部分putParcelableArrayListExtra()

+0

我很抱歉,我沒有得到你。我的應用程序位於com.Lak包中,我現在應該做什麼?是的...商店類實現Parcelable ... :) – 2011-04-02 16:24:55

+0

調用putPa ..(「com.Lak.myclass」,B) – 2011-04-03 06:07:44

+0

Thanx男人。我會試試這個:-) – 2011-04-03 10:30:46

相關問題