Преминаване на 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.


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 memvars.   -  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 = savedInstanceState .getParcelableArrayList(com.example.episodetracker.listofseries);` - person Adrian Jandl; 28.02.2013
comment
Името му в пакета няма особено значение, можете да го наречете MyArray като ключ и трябва да работи. На коя линия се срива? - person snowCrabs; 28.02.2013
comment
Срив на реда, където зареждам в новата си дейност. По-конкретно този ред: ArrayList‹Series› list = savedInstanceState .getParcelableArrayList(com.example.episodetracker.listofseries);` - person Adrian Jandl; 28.02.2013
comment
Трябва да извикате от намерението, а не от savedInstanceState - 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 обект. Не директно от 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<> трябва да съдържа само парцелируеми обекти. и само за да сте сигурни, че сте предали данните, можете да проверите дали получените данни са нулеви или не, само за да избегнете проблеми.

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