2011-11-13 16 views

Odpowiedz

17

Możesz sprawić, aby Twoje obiekty zaimplementować Parcelable i użyć putParcelableArrayListExtra. Alternatywnie możesz serializować obiekty w jakiś sposób i umieścić tablicę bajtów swoich serializowanych obiektów.

+11

kodu przykład pomógłby – adit

+0

@adit - Aby uzyskać przykład kodu na temat tworzenia Parceli, spójrz na [dokumenty dla Parcelable] (http://developer.android.com/reference/android/os/Parcelable.html). Następnie możesz użyć ArrayList w wywołaniu 'putParcelableArrayListExtra()'. –

+0

mając problemy, ponieważ mój obiekt ma obiekt Location, więc nie wiem, jak sobie z tym poradzić w metodzie writeToParcel – adit

17

To jest przykład. MainActivity wysyła listę osób do OtherActivity przez Intent.

class Person implements Serializable { 
    int id; 
    String name; 

    Person(int i, String s) { 
     id = i; 
     name = s; 
    } 
} 

public class TestAndroidActivity extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ArrayList<Person> list = new ArrayList<Person>(); 
     list.add(new Person(1, "Tom")); 
     list.add(new Person(5, "John")); 

     Intent intent = new Intent(this, OtherActitity.class); 
     intent.putExtra("list", list); 
     startActivity(intent); 

OtherActivity.java

import java.util.ArrayList; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.Toast; 

public class OtherActitity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.other); 

     Intent i = getIntent(); 
     ArrayList<Person> list = (ArrayList<Person>) i 
       .getSerializableExtra("list"); 
     Toast.makeText(this, list.get(1).name, Toast.LENGTH_LONG).show(); 

    } 
} 
+4

Należy pamiętać, że użycie * Serializable * w tym przypadku wiąże się z karą wykonania, więc należy użyć * Parceli *. – JimmyB

+0

Dziękuję za informację. – wannik

+5

'intent.putExtra (" lista ", lista);' daje mi błąd: 'nie może rozwiązać metody' –

3

Lepszym pomysłem jest wdrożenie Parcelable interfejs dla obiektu, którego ArrayList chcesz umieścić w intencji .Dla przykładu:

public class Person realizuje Parcelable {

private int id; 
private String name; 
public int getId() { 
    return id; 
} 
public void setId(int id) { 
    this.id = id; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
@Override 
public int describeContents() { 
    return this.hashCode(); 
} 
@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeInt(id); 
    dest.writeString(name); 
} 

}

A następnie kod aplikacji można powiedzieć:

bundle.putParcelableArrayList ("personList", personList);

+0

Tak brzmi pierwsza odpowiedź. –

6

Jeszcze jeden sposób - można szeregować listę obiektów w jakiś ciąg znaków (niech to będzie JSON), a następnie pobrać wartość ciąg powrót do listy

// here we use GSON to serialize mMyObjectList and pass it throught intent to second Activity 
String listSerializedToJson = new Gson().toJson(mMyObjectList); 
intent.putExtra("LIST_OF_OBJECTS", listSerializedToJson); 
startActivity(intent); 

// in second Activity we get intent and retrieve the string value (listSerializedToJson) back to list 
String listSerializedToJson = getIntent().getExtras().getString("LIST_OF_OBJECTS"); 
mMyObjectList = new Gson().fromJson(objectsInJson, MyObject[].class); // in this example we have array but you can easy convert it to list - new ArrayList<MyObject>(Arrays.asList(mMyObjectList));