Как передать список через намерение - PullRequest
0 голосов
/ 27 августа 2018

Я пытаюсь передать top50TrendsList другому действию через Intent, как показано ниже в коде, но оно помечено красным, и я получаю сообщение об ошибке:

2nd parameter cant be cast to Serializable

несмотря на то, что класс Trend реализует Serializable интерфейс.

Пожалуйста, дайте мне знать, как передать top50TrendsList через Intent в другой вид деятельности?Спасибо.

код :

    List<Trend> top50TrendsList = this.mTrendsList.subList(0, 2);
Collections.sort(this.mTrendsList);
    Intent intentSendBroadcast = new Intent();
    intentSendBroadcast.setAction(ActMain.CONST_BROADCAST_ACTION_ON_LIST_READY);
    Bundle b = new Bundle();
    b.putSerializable(TwitterTrendsAPIService.CONST_BUNDLE_KEY_SERIALIZED_LIST, top50TrendsList);
    intentSendBroadcast.putExtras(b);
    sendBroadcast(intentSendBroadcast);

Ответы [ 4 ]

0 голосов
/ 27 августа 2018

Использовать Parcelable

public class Test implements Parcelable
{
    List<String> list;

    protected Test(Parcel in) {
        list = in.createStringArrayList();
    }

    public Test()
    {}

    public static final Creator<Test> CREATOR = new Creator<Test>() {
        @Override
        public Test createFromParcel(Parcel in) {
            return new Test(in);
        }

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

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

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

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeStringList(list);
    }
}

setList для класса Model и перейти к другой деятельности:

List<String> list = new ArrayList<>();
        Test test = new Test();
        test.setList(list);

        Intent intent = new Intent(this, Main2Activity.class);
        intent.putExtra("list", test);
        startActivity(intent);

Для получения данных из второго упражнения:

if (getIntent().hasExtra("list"))
        {
            List<String> list = new ArrayList<>();
            Test test = getIntent().getParcelableExtra("list");
            list.addAll(test.getList());
        }
0 голосов
/ 27 августа 2018

ArrayList реализует Сериализуемый, а не Список. Вы предоставляете объект с помощью ссылки List (interface) (а Java имеет одну диспетчеризацию, поэтому перегруженный вариант метода, который нужно вызвать, идентифицируется во время компиляции по ссылочному типу, а не по фактическому типу объекта во время выполнения). Передайте его через ссылку на ArrayList, и я полагаю, что это будет хорошо для ваших целей.

0 голосов
/ 27 августа 2018

Ваш класс Trend должен реализовывать Serializable следующим образом

открытый класс Trend реализует Сериализуемый

0 голосов
/ 27 августа 2018

Ну, ваш Trend должен быть Parcelable, и тогда вы можете сделать это как

intent.putParcelableArrayListExtra("myArrayList" , top50TrendsList);

Взгляните на это , чтобы узнать о parceable и о том, как сделать ваш класс parceable.

Надеюсь, это поможет.

...