Передача ArrayList <Object>в Android Studio с API Lastfm - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь передать ArrayList типа Album другому действию в Android Studio.

Проблема в том, что API Lastfm, который я использую , не реализует Parcelable.

Я попытался создать свой собственный класс Album и расширить его класс Album, но я получил ошибку

"нет конструктора по умолчанию, доступного в 'de.umass.lastfm.Album'

Quiz.java - intent.getParcel ... не работает, так как альбом не подлежит обработке

public class Quiz extends AppCompatActivity  {

private static TextView tv_quiz;
private static EditText et_quiz;
private ArrayList<Album> albums;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);

    Intent intent = getIntent();
    albums = intent.getParcelableArrayListExtra(MainActivity.ALBUMS_LIST);
}
}

Вызывающая часть моего MainActivity.java.

Intent intent = new Intent(this, Quiz.class);
    intent.putExtra(ALBUMS_LIST, allAlbums);
    intent.putExtra(DIFFICULTY, difficulty);
    startActivity(intent);

Есть ли способ, которым я могу получитьвокруг этого?

Все равно спасибо

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Я посмотрел на API, который вы связали, и Album выглядит крайне сложно для посылки.Я бы сказал, что вам лучше перезапустить список в следующем упражнении (а не пытаться передать список).

Единственный способ «создать» новый экземпляр Album - это черезgetInfo() статический фабричный метод.Вы можете создать новый класс AlbumWrapper, который будет доступен для отправки, отправить список AlbumWrapper через Intent, а затем использовать getInfo() на другой стороне для повторного извлечения альбомов.

public class AlbumWrapper implements Parcelable {

    // insert CREATOR here

    public final String artist;
    public final String mbid;

    public AlbumWrapper(Album a) {
        this.artist = a.getArtist();
        this.mbid = a.getMbid();
    }

    private AlbumWrapper(Parcel in) {
        this.artist = in.readString();
        this.mbid = in.readString();
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(artist);
        dest.writeString(mbid);
    }

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

Вы можете поместить свой список альбомов в цель следующим образом:

ArrayList<AlbumWrapper> wrappers = new ArrayList<>();

for (Album album : albums) {
    AlbumWrapper wrapper = new AlbumWrapper(album);
    wrappers.add(wrapper);
}

intent.putParcelableArrayListExtra("ALBUM_WRAPPERS", wrappers);

А затем в своем следующем упражнении вы можете сделать что-то вроде:

List<AlbumWrapper> wrappers = getIntent().getParcelableArrayListExtra("ALBUM_WRAPPERS");
List<Album> albums = new ArrayList<>();

for (AlbumWrapper wrapper : wrappers) {
    Album album = Album.getInfo(wrapper.artist, wrapper.mbid, YOUR_API_KEY);
    albums.add(album);
}
0 голосов
/ 29 января 2019

Вот решение открытой активности с использованием этого кода

Bundle bundle = new Bundle();
bundle.putSerializable("data", allAlbums);
bundle.putString(DIFFICULTY", difficulty);
Intent intent = new Intent(this, Quiz.class);
    intent.putExtra(bundle);
    startActivity(intent);

получение данных о намерениях

albums = (ArrayList<Album>) getIntent().getExtras().getSerializable("data");

обновленный класс альбома

public class Album implements java.io.Serializable {

//your code
}
...