Как передать Arraylist из первого занятия во второе? - PullRequest
0 голосов
/ 02 апреля 2011

Я пытаюсь передать arraylist из активности SpinPizza.java в Bill.java (используя Parcelable).

Теперь проблема в том, что в получающем действии массив, который я получаю, изменяется сам по себе... то есть.он содержит только последние введенные значения во всех своих индексах ... Я не могу понять причину этого ... Я публикую соответствующий код ниже: -

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



}}}

Пожалуйста, помогите мне.

ОБНОВЛЕНИЕ

@ Flo Я попытался сделать это через класс Application.Но сейчас я получаю исключение нулевого указателя. (Я упомянул ниже в строке, где я его получаю)

Это мой исправленный код.

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 ... Он просто отправляет класс по умолчанию .. (определено NULL) :-(

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Ваш метод putParcelableArrayListExtra() должен иметь полное имя класса - в документах говорится:

Добавить расширенные данные к цели.Имя должно включать префикс пакета, например, приложение com.android.contacts будет использовать такие имена, как «com.android.contacts.ShowAll».

Имеет ли ваш класс store (кстати, имена классовдолжен начинаться с заглавной буквы) реализовать Parcelable?Это часть договора putParcelableArrayListExtra()

1 голос
/ 02 апреля 2011

Почему бы вам не использовать класс singleton или класс Application для передачи списка другому действию.Класс Singleton или Application может быть доступен из любого места в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...