2011-12-28 31 views
5

Tôi đang cố gắng chuyển danh sách mảng giữa các hoạt động trong Android. Danh sách chứa chuỗi. Tôi đã đọc rất nhiều về Parcelable. Tôi có cần phải tạo một Bưu kiện để vượt qua danh sách mảng Chuỗi không? Hiện tại tôi đang sử dụng putStringArrayListExtra() và getSringArrayListExtra() để truyền các danh sách thông qua các mục đích.Truyền ArrayLists trong Android

Đây là một số mã của tôi.

Intent load = new Intent(getApplicationContext(), HelloTabWidget.class); 
     load.putStringArrayListExtra("albums", albums); 
     load.putStringArrayListExtra("songs", songs); 
     load.putStringArrayListExtra("artists", artists); 
     load.putStringArrayListExtra("fileName", fileName); 

Đây là phương pháp onCreate của tôi cho hành động có được danh sách mảng.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.songlist); 

    Bundle extras = getIntent().getExtras(); 
    isArtists = extras.getBoolean("artists"); 
    isAlbums = extras.getBoolean("albums"); 
    isSongs = extras.getBoolean("songs"); 

     Intent get = getIntent(); 
     songs = get.getStringArrayListExtra("songs"); 
     artists = get.getStringArrayListExtra("artists"); 
     albums = get.getStringArrayListExtra("albums"); 
     fileName = get.getStringArrayListExtra("fileName"); 



    if(isArtists == true)  
     updateArtistsList(); 
    else if(isAlbums == true) 
     updateAlbumsList(); 
    else if(isSongs == true) 
     updateSongList();  
} 

Lớp học lấy danh sách được cho là tạo danh sáchXem từ dữ liệu trong danh sách. Bất cứ khi nào tôi chạy mã tôi nhận được nullPointerExceptions khi cố gắng để làm cho danh sách. Tôi biết rằng mã listView của tôi hoạt động, vì vậy tôi đã thu hẹp vấn đề về các mục đích chuyển các danh sách mảng.

Xin cảm ơn trước.

EDIT: Dưới đây là một vài dòng đầu tiên từ logcat.

12-28 03:03:42.313: E/AndroidRuntime(873): FATAL EXCEPTION: main 
12-28 03:03:42.313: E/AndroidRuntime(873): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adam.mediaplayer/com.adam.mediaplayer.HelloTabWidget}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adam.mediaplayer/com.adam.mediaplayer.MakeListActivity}: java.lang.NullPointerException 
+0

dán một số bản ghi lỗi và số dòng mà bạn có ngoại lệ – bindal

+0

bạn có nhận được các giá trị rỗng với các arraylists hoặc các boolean hoặc cả hai? – MikeIsrael

+0

Tôi nghĩ rằng đó là arraylists. Các booleans làm việc tốt. –

Trả lời

4

Nó phụ thuộc vào loại ArrayList

  • putIntegerArrayListExtra(String name, ArrayList<Integer> value)

  • putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)

  • putStringArrayListExtra(String name, ArrayList<String> value)

  • putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value)

Sau đó, bạn có thể đọc từ bạn hoạt động tiếp theo bằng cách thay thế put với get với chuỗi chìa khóa như là đối số, ví dụ:

myIntent.getStringArrayListExtra("arrayListName"); 
+0

Điều này đã kết thúc. Cảm ơn bạn. –

+0

@Lalit Poptani +1 câu trả lời tuyệt vời !!!!! – Venky

4

Đây là cách bạn có thể vượt qua một ArrayList:

MyListClass.java - lớp Tuỳ chỉnh

public class MyListClass implements Parcelable{ 

private int test; 

public MyListClass() 
{} 

public MyListClass(Parcel read){ 
    test = read.readInt(); 
} 

public int getTest() { 
    return test; 
} 

public void setTest(int test) { 
    this.test = test; 
} 

public static final Parcelable.Creator<MyListClass> CREATOR = 
    new Parcelable.Creator<MyListClass>() { 

     @Override 
     public MyListClass createFromParcel(Parcel source) { 
      return new MyListClass(source); 
     } 

     @Override 
     public MyListClass[] newArray(int size) { 
      return new MyListClass[size]; 
     } 
    }; 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel arg0, int arg1) { 
    arg0.writeInt(test); 
} 

}

MyParcelable.java

public class MyParcelable implements Parcelable { 

private List<MyListClass> arrList = new ArrayList<MyListClass>(); 
private int myInt = 0; 
private String str = null; 

public String getStr() { 
    return str; 
} 

public void setStr(String str) { 
    this.str = str; 
} 

public List<MyListClass> getArrList() { 
    return arrList; 
} 

public void setArrList(List<MyListClass> arrList) { 
    this.arrList = arrList; 
} 

public int getMyInt() { 
    return myInt; 
} 

public void setMyInt(int myInt) { 
    this.myInt = myInt; 
} 

MyParcelable() { 
    // initialization 
    arrList = new ArrayList<MyListClass>(); 
} 

public MyParcelable(Parcel in) { 
    myInt = in.readInt(); 
    str = in.readString(); 
    in.readTypedList(arrList, MyListClass.CREATOR); 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel outParcel, int flags) { 
    outParcel.writeInt(myInt); 
    outParcel.writeString(str); 
    outParcel.writeTypedList(arrList); 
} 

public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() { 

    @Override 
    public MyParcelable createFromParcel(Parcel in) { 
     return new MyParcelable(in); 
    } 

    @Override 
    public MyParcelable[] newArray(int size) { 
     return new MyParcelable[size]; 
    } 
}; 

}

MainAcitivty.java

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    arrList.add(new MyListClass()); 
    arrList.get(0).setTest(200); 

    MyParcelable object = new MyParcelable(); 
    object.setMyInt(100); 
    object.setArrList(arrList); 

    Intent intent = new Intent(MainActivity.this,ReceiverParcel.class); 
    intent.putExtra("parcel", object); 
    startActivity(intent); 
} 

ReceiverParcel.java

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Bundle b = getIntent().getExtras(); 
    MyParcelable object = b.getParcelable("parcel"); 

    System.out.println(object.getArrList().get(0).getTest()); 
    System.out.println(object.getMyInt()); 

}

+0

Vì vậy, bạn cần phải sử dụng vật phẩm parcables? Tôi sẽ cố gắng này ngay bây giờ. –

+0

@AdamJakiela Cách để vượt qua ArrayList giữa các hoạt động .. – Venky

+0

+1 cho một câu trả lời hay: P –

Các vấn đề liên quan