Передать ArrayList‹? реализует Parcelable› в 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.


person Adrian Jandl    schedule 28.02.2013    source источник
comment
1/ я не понимаю, что не работает в вашем коде. 2/ Вы не сохраняете списки где-нибудь? поэтому не лучше ли работать с базой данных, а не с массивом, который вы передаете от действия к действию?   -  person njzk2    schedule 28.02.2013
comment
Parcelables - это, так сказать, дьявол ... вы пытались вместо этого сделать его Serializable?   -  person snowCrabs    schedule 28.02.2013
comment
У меня сложилось впечатление, что Parcelable — это то, что нужно, поскольку Serializable намного медленнее?   -  person Adrian Jandl    schedule 28.02.2013
comment
Parcelable упрощает сложные классы. Что касается скорости, о каком количестве записей данных мы говорим?   -  person snowCrabs    schedule 28.02.2013
comment
ArrayList с ~10 записями, где каждая запись имеет 3 мемвара.   -  person Adrian Jandl    schedule 28.02.2013


Ответы (6)


  • Проблема в записи в посылку и чтении из посылки...

    @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() из двух разных действий. Первый запускает второй; и он отлично работает, я смог вытащить посылку без проблем.

person snowCrabs    schedule 28.02.2013
comment
Изменил. Однако NullPointerException остается. В этой части ничего не изменилось, хотя `ArrayList‹Series› list = saveInstanceState .getParcelableArrayList(com.example.episodetracker.listofseries);` - person Adrian Jandl; 28.02.2013
comment
Его имя в комплекте не имеет большого значения, вы можете назвать его MyArray в качестве ключа, и он должен работать. На какой линии происходит сбой? - person snowCrabs; 28.02.2013
comment
Сбой в строке, где я загружаю свою новую активность. В частности, эта строка: ArrayList‹Series› list = saveInstanceState .getParcelableArrayList(com.example.episodetracker.listofseries);` - person Adrian Jandl; 28.02.2013
comment
Вы должны звонить из намерения, а не из saveInstanceState - person snowCrabs; 28.02.2013
comment
Я ходил по кругу в течение часа... все было прекрасно, кроме заказа... - person me_; 28.07.2018

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

person Ovidiu Latcu    schedule 28.02.2013
comment
intent.putParcelableArrayListExtra( "com.example.episodetracker.listofseries", (ArrayList<? extends Parcelable>) listOfSeries); это правильный способ сделать это? Если я не приведу его, я получаю следующую ошибку: Метод putParcelableArrayListExtra(String, ArrayList‹? extends Parcelable›) в типе Intent неприменим для аргументов (String, List‹Series›) - person Adrian Jandl; 28.02.2013
comment
объявите свой listOfSeries как ArrayList, а не List. - person Ovidiu Latcu; 28.02.2013
comment
Хорошо, это порадовало компилятор. Однако программа по-прежнему падает, когда я пытаюсь прочитать данные. Я обновил исходный пост фрагментом logcat. - person Adrian Jandl; 28.02.2013

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

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<> должен содержать только объекты, которые можно разделить. и просто чтобы убедиться, что вы передали данные, вы можете проверить, являются ли полученные данные нулевыми или нет, просто чтобы избежать проблем.

person AXSM    schedule 14.03.2013

Может быть, это кому-то поможет... еще моя проблема заключалась в том, что я использовал write и readValue, но он должен соответствовать типу, например writeInt, readInt writeString, readString и т. д.

person Peter Isberg    schedule 25.07.2015

Я делаю это таким образом:

var intent = Intent(this@McqActivity,ResultActivity::class.java)
intent.putParcelableArrayListExtra("keyResults", ArrayList(resultList)) 
// resultList  is of type mutableListOf<ResultBO>()  
 startActivity(intent)

И за создание класса Parcelable . Я просто делаю two operation: сначала я использовал @Parcelize Annotation над своим классом данных, а во-вторых, я наследую его с помощью Parcelable, как показано ниже.

import kotlinx.android.parcel.Parcelize
import android.os.Parcelable

@Parcelize // Include Annotion 
data class ResultBO(val questionBO: QuestionBO) : Parcelable {
    constructor() : this(QuestionBO())
}

И на принимающей стороне

if (intent != null) {
     var results = intent.getParcelableArrayListExtra<Parcelable>("keyResults")
}
person AndroidGeek    schedule 13.11.2018

Вы можете передать Parcelable ArrayList

Действия отправителя ->

startActivity(Intent(this, SenderActivity::class.java).apply { putExtra("getList",list)})

Активность получателя ->

private lateinit var list: ArrayList<List>

list = this.intent.extras?.getParcelableArrayList("getList")!!

И вы получите весь Arraylist в списке.

person DEVENDRA SINGH    schedule 08.01.2020