在带有 Lastfm API 的 Android Studio 中传递 ArrayList<Object>
Passing ArrayList<Object> in Android Studio w/ Lastfm API
我正在尝试将 Album 类型的 ArrayList 传递给 Android Studio 中的另一个 activity。
问题是 the Lastfm API I am using 没有实现 Parcelable。
我尝试制作自己的相册 class 并扩展他们的相册 class 但出现错误
"'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);
有什么办法可以解决这个问题吗?
谢谢大家
这是解决方案
使用此代码
打开 activity
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");
更新相册Class
public class Album implements java.io.Serializable {
//your code
}
我看了你链接的api,Album
看起来很难包裹。我会说你最好在下一个 Activity 中重新加载列表(而不是试图通过列表)。
"construct" 新 Album
实例的唯一方法是通过 getInfo()
静态工厂方法。您可以创建一个可打包的新 class AlbumWrapper
,通过 Intent 发送 AlbumWrapper
的列表,然后在另一端使用 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);
然后在下一个 activity 中,您可以执行以下操作:
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);
}
我正在尝试将 Album 类型的 ArrayList 传递给 Android Studio 中的另一个 activity。
问题是 the Lastfm API I am using 没有实现 Parcelable。
我尝试制作自己的相册 class 并扩展他们的相册 class 但出现错误
"'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);
有什么办法可以解决这个问题吗?
谢谢大家
这是解决方案 使用此代码
打开 activityBundle 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");
更新相册Class
public class Album implements java.io.Serializable {
//your code
}
我看了你链接的api,Album
看起来很难包裹。我会说你最好在下一个 Activity 中重新加载列表(而不是试图通过列表)。
"construct" 新 Album
实例的唯一方法是通过 getInfo()
静态工厂方法。您可以创建一个可打包的新 class AlbumWrapper
,通过 Intent 发送 AlbumWrapper
的列表,然后在另一端使用 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);
然后在下一个 activity 中,您可以执行以下操作:
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);
}