2013-02-28 1 views
19

Я искал несколько тем, но не нашел решение моей проблемы.Pass ArrayList <? реализует Parcelable> to Activity

public class Series implements Parcelable { 
private String name; 
private int numOfSeason; 
private int numOfEpisode; 

/** Constructors and Getters/Setters have been removed to make reading easier **/ 

public Series(Parcel in) { 
    String[] data = new String[3]; 
    in.readStringArray(data); 
    this.name = data[0]; 
    this.numOfSeason = Integer.parseInt(data[1]); 
    this.numOfEpisode = Integer.parseInt(data[2]); 
} 


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

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeStringArray(new String[] { this.name, 
      String.valueOf(this.numOfSeason), 
      String.valueOf(this.numOfEpisode) }); 

} 

private void readFromParcel(Parcel in) { 
    name = in.readString(); 
    numOfSeason = in.readInt(); 
    numOfEpisode = in.readInt(); 
} 

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { 
    @Override 
    public Series createFromParcel(Parcel in) { 
     return new Series(in); 
    } 

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

}

В моей MainActivity У меня есть ArrayList. Чтобы сделать список динамически редактируемым, мне нужно передать его другому действию, где я могу его редактировать.

ArrayList<Series> listOfSeries = new ArrayList<Series>(); 

    public void openAddActivity() { 
    Intent intent = new Intent(this, AddActivity.class); 
    intent.putParcelableArrayListExtra(
      "com.example.episodetracker.listofseries", 
      (ArrayList<? extends Parcelable>) listOfSeries); 
    startActivity(intent); 
} 

Мне нужно отобразить список, иначе Eclipse предоставит мне следующее сообщение об ошибке. Метод putParcelableArrayListExtra (String, ArrayList) в типе Intent не применяется для аргументов (String, List)

это правильный способ сделать это?

ArrayList<Series> list = savedInstanceState 
      .getParcelableArrayList("com.example.episodetracker.listofseries"); 

Так я пытаюсь прочитать данные в другом виде.

Это грохот на линии выше. а именно: getParcelableArrayList.

+0

1/я не понимаю, что не работает в вашем коде. 2/разве вы не сохраняете списки где-нибудь? поэтому было бы лучше работать с базой данных, а не с массивом, который вы переходите от активности к активности? – njzk2

+0

Parcelables - это, черт возьми, так сказать ... вы пытались сделать это Serializable вместо этого? – snowCrabs

+1

У меня создалось впечатление, что Parcelable - это путь, потому что Serializable намного медленнее? –

ответ

28
  • Проблема заключается в письменной форме, чтобы посылки и чтения в от посылки ...

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
        dest.writeString(name); 
        dest.writeInt(numOfSeason); 
        dest.writeInt(numOfEpisode); 
    } 
    
    private void readFromParcel(Parcel in) { 
        name = in.readString(); 
        numOfSeason = in.readInt(); 
        numOfEpisode = in.readInt(); 
    } 
    
  • Что вы выписывать должен соответствовать тому, что вы читаете в ...

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    
    Intent i = new Intent(this,SecondActivity.class); 
    
    ArrayList<testparcel> testing = new ArrayList<testparcel>(); 
    
    i.putParcelableArrayListExtra("extraextra", testing); 
    startActivity(i); 
    } 
    
        /**********************************************/ 
    
    
    public class SecondActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
    
        ArrayList<testparcel> testing = this.getIntent().getParcelableArrayListExtra("extraextra"); 
    } 
    } 
    
  • Приведенный выше код имеет onCreate() из двух разных видов деятельности. Первый запускает второй; и он отлично работает, я смог вытащить аргумент без проблем.

+0

Изменено. Однако исключение NullPointerException сохраняется. Не изменились ничего в этой части, хотя 'ArrayList список = savedInstanceState .getParcelableArrayList («com.example.episodetracker.listofseries»);' –

+0

имя его в комплекте не имеет никакого значения, вы могли бы назвать его «MyArray» как ключ, и он должен работать. В какой строке он рушится? – snowCrabs

+0

Сбой на линии, где я «загружаю» в своем новом действии. В частности, эта строка: ArrayList list = savedInstanceState .getParcelableArrayList ("com.example.episodetracker.listofseries"); ' –

2

Вы должны использовать метод putParcelableArrayListExtra() на классе Intent.

+0

'intent.putParcelableArrayListExtra (\t \t "com.example.episodetracker.listofseries", (ArrayList) listOfSeries <расширяет Parcelable?>);' это правильный способ сделать это? Если я его не произвела, я получаю следующую ошибку: ** Метод putParcelableArrayListExtra (String, ArrayList ) в типе Intent не применим для аргументов (String, List ) ** –

+9

объявите ваш 'listOfSeries' как' ArrayList', а не 'List'. –

+1

Хорошо, что сделало компилятор счастливым. Однако программа по-прежнему падает, когда я пытаюсь прочитать данные. Я обновил исходное сообщение с помощью фрагмента logcat. –

3

Я использовал putParcelableArrayList(<? extends Parcelable>) от Bundle Объект. Не прямо из объекта Intent Object (я не знаю, в чем разница). но я использую, чтобы использовать таким образом:

ArrayList<ParcelableRow> resultSet = new ArrayList<ParcelableRow>(); 
resultSet = loadData(); 

Bundle data = new Bundle(); 
data.putParcelableArrayList("search.resultSet", resultSet); 
yourIntent.putExtra("result.content", data); 
startActivity(yourIntent); 

Позже на новой деятельности, вы можете заполнить данные недавно вставленные на объекте Bundle, как это:

Bundle data = this.getIntent().getBundleExtra("result.content"); 
ArrayList<ParcelableRow> result = data.getParcelableArrayList("search.resultset"); 

Просто помните, что ваш ArrayList<> должен содержать только разборчивых объектов. и просто чтобы убедиться, что вы передали данные, которые вы можете проверить, являются ли полученные данные нулевыми или нет, просто чтобы избежать проблем.

0

Может быть, это поможет кому-то .. еще моя проблема в том, что я использовал запись и readValue, но он должен соответствовать типу, как WriteInt, readInt WriteString, ReadString и так далее