Помощь с передачей ArrayList и разумная активность

Таким образом, я больше всего заработал вчера и последний конечный результат, и, похоже, не могу обернуть голову тем, как передать arraylist в субактивность. Существует множество примеров и фрагментов, передающих примитивные типы данных, но у меня есть arraylist адрес типа (address.java ниже).

Я нашел много вещей в stackoverflow и вокруг Интернета на этом, но ничего, что привлекло много внимания, кроме одного с примером GeoPoint. Опять же, это выглядело так, как будто они просто сгладили объект GeoPoint на два целых числа и передали его. Я не могу этого сделать, потому что мой класс адресов может расширяться, чтобы включать целые числа, float, что угодно. Прямо сейчас тестовое приложение ниже – это всего лишь две строки для простоты. Я подумал, что если я смогу получить материал parcelalbe, работающий с этим, остальные могут следовать.

Может ли кто-нибудь опубликовать рабочий пример для ArrayList не примитивного объекта или, возможно, добавить код ниже, чтобы сделать эту работу?

UPDATE : ниже приведен код ниже после ответов / редактирования. Благодаря!

/* helloParcel.java */ public class helloParcel extends Activity { // holds objects of type 'address' == name and state private ArrayList <address> myList; @Override public void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); setContentView (R.layout.main); Button b1 = (Button) findViewById(R.id.button1); b1.setOnClickListener(ocl); myList = new ArrayList(); address frank = new address ("frank", "florida"); address mary = new address ("mary", "maryland"); address monty = new address ("monty", "montana"); myList.add (frank); myList.add (mary); myList.add (monty); // add the myList ArrayList() the the extras for the intent } OnClickListener ocl = new OnClickListener() { @Override public void onClick(View v) { // fill parceable and launch activity Intent intent = new Intent().setClass(getBaseContext (), subActivity.class); // for some reason, I remember a posting saying it's best to create a new // object to pass. I have no idea why.. ArrayList <address> addyExtras = new ArrayList <address>(); for (int i = 0; i < myList.size(); i++) addyExtras.add (myList.get(i)); intent.putParcelableArrayListExtra ("mylist", addyExtras); startActivity(intent); } }; } /* address.java */ public class address implements Parcelable { private String name; private String state; private static String TAG = "** address **"; public address (String n, String s) { name = n; state = s; Log.d (TAG, "new address"); } public address (Parcel in) { Log.d (TAG, "parcel in"); name = in.readString (); state = in.readString (); } public String getState () { Log.d (TAG, "getState()"); return (state); } public String getName () { Log.d (TAG, "getName()"); return (name); } public static final Parcelable.Creator<address> CREATOR = new Parcelable.Creator<address>() { public address createFromParcel(Parcel in) { Log.d (TAG, "createFromParcel()"); return new address(in); } public address[] newArray (int size) { Log.d (TAG, "createFromParcel() newArray "); return new address[size]; } }; @Override public int describeContents () { Log.d (TAG, "describe()"); return 0; } @Override public void writeToParcel (Parcel dest, int flags) { Log.d (TAG, "writeToParcel"); dest.writeString (name); dest.writeString (state); } } /* subActivity.java */ public class subActivity extends Activity { private final String TAG = "** subActivity **"; private ArrayList <address> myList; @Override protected void onCreate (Bundle savedInstanceState) { super.onCreate (savedInstanceState); Log.d (TAG, "onCreate() in subActivity"); setContentView(R.layout.subactivity); TextView tv1 = (TextView) findViewById(R.id.tv_sub); myList = getIntent().getParcelableArrayListExtra ("mylist"); Log.d (TAG, "got myList"); for (int i = 0; i < myList.size (); i++) { address a = myList.get (i); Log.d (TAG, "state:" + a.getState ()); tv1.setText (a.getName () + " is from " + a.getState ()); } } } 

Solutions Collecting From Web of "Помощь с передачей ArrayList и разумная активность"

Здесь я вижу ряд проблем:

  1. Зачем использовать addressParcelable? Почему бы не сделать реализацию адреса Parcelable, а затем использовать:

     intent.putParcelableArrayListExtra( "addresses", addyExtras ); 
  2. Ваш аргумент должен содержать статический CREATOR. Подробнее см. В документации .

  3. На самом деле вы не добавляете какие-либо дополнения в намерение, прежде чем вы вызове startActivity() . См. Пункт 1 для предложения здесь.

Я думаю, что вам нужно будет решить все эти проблемы, чтобы заставить его работать.

Это может быть сделано намного проще, без всякой боли в использовании ParcelableArrayList (но НЕ какой-либо List ) является Serializable . Таким образом, вы можете поместить весь список с помощью putExtra() и получить его с помощью getSerializableExtra() , как сказал Сэм.

НО, я хочу добавить еще одну важную вещь: объект, который хранит список ваших массивов, также должен реализовывать Serializable … и все другие сложные объекты, которые объект может содержать (в вашем случае нет), должны также реализовать это (так что это рекурсивный – Чтобы сериализовать объект, вы должны иметь возможность сериализовать все его поля).

Теперь вы можете спросить себя, почему внедрение Serializable вместо Parcelable когда есть методы для чтения и записи списков массивов посылок? Ну … разница простота – просто добавьте implements Serializable и, возможно, private static final long serialVersionUID = SOME_CONSTANT и вы private static final long serialVersionUID = SOME_CONSTANT ! Вот почему я никогда не использую Parcelable – вы можете делать все эти вещи с помощью Serializable буквально с двумя строками кода – вместо многих наследований методов и всего этого …

Вы можете передать объекты Serializable через putExtra. ArrayList реализует Serializable.

Майк дг прав!

putExtra() и getSerializable() будут хранить и извлекать ArrayList<> ваших пользовательских объектов, без необходимости реализации интерфейса. Работал для меня!