2011-12-28 2 views
5

Я пытаюсь передать списки массивов между действиями в Android. Списки содержат строки. Я много читал о Parcelable. Мне нужно создать Parcelable для передачи списка массивов String? На данный момент я использую putStringArrayListExtra() и getSringArrayListExtra() для передачи списков через намерения.Передача ArrayLists в Android

Вот некоторые из моих кодов.

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

Это мой метод onCreate для acticity, который получает список массивов.

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

Класс, который извлекает список, должен создать listView из данных в списках. Всякий раз, когда я запускаю код, я получаю nullPointerExceptions при попытке сделать списки. Я знаю, что мой код listView работает, поэтому я сузил проблему до намерений, которые передают списки массивов.

Заранее спасибо.

EDIT: Вот первые несколько строк из логарифма.

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

вставить некоторый журнал ошибок и номер строки, на которую вы получили исключение – bindal

+0

вы получаете нули с помощью arraylists или логических или обоих? – MikeIsrael

+0

Я думаю, что это аррайалисты. Булевы прекрасно работают. –

ответ

4

Это зависит от типа 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)

Тогда вы можете прочитать от вас следующего действия, заменив put с get с ключевой строкой в ​​качестве аргумента, например

myIntent.getStringArrayListExtra("arrayListName"); 
+0

Это закончило работу. Спасибо. –

+0

@Lalit Poptani +1 отличный ответ !!!!! – Venky

4

Вот как вы можете передать ArrayList:

MyListClass.java - Пользовательский класс

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

Значит, вам нужно использовать передачи? Я попробую это сейчас. –

+0

@AdamJakiela Способ передать ArrayList между действиями .. – Venky

+0

+1 для приятного ответа: P –

Смежные вопросы