[英]How to pass Class of Class in ArrayList from one Activity to Another Activity
[英]How to pass entire Arraylist to another activity
我正在制作一个 mp3 播放器应用程序,在我的主要活动中,我在回收站视图中显示所有歌曲的列表,当用户单击歌曲时,我试图将整个歌曲列表发送到我的播放器活动,我可以在那里工作播放下一首和上一首歌曲,但单击歌曲时我的应用程序崩溃
Process: com.choudhary.musicplayer, PID: 8686
java.lang.RuntimeException: Parcel: unable to marshal value com.choudhary.musicplayer.AudioModel@a0de380
at android.os.Parcel.writeValue(Parcel.java:1667)
at android.os.Parcel.writeList(Parcel.java:966)
at android.os.Parcel.writeValue(Parcel.java:1614)
at android.os.Parcel.writeArrayMapInternal(Parcel.java:878)
at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1588)
at android.os.Bundle.writeToParcel(Bundle.java:1233)
at android.os.Parcel.writeBundle(Parcel.java:918)
at android.content.Intent.writeToParcel(Intent.java:9987)
at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:3636)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1675)
at android.app.Activity.startActivityForResult(Activity.java:4651)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:597)
at android.app.Activity.startActivityForResult(Activity.java:4609)
at androidx.activity.ComponentActivity.startActivityForResult(ComponentActivity.java:583)
at android.app.Activity.startActivity(Activity.java:4970)
at android.app.Activity.startActivity(Activity.java:4938)
at com.choudhary.musicplayer.MusicAdapter$1.onClick(MusicAdapter.java:54)
at android.view.View.performClick(View.java:6608)
at android.view.View.performClickInternal(View.java:6585)
at android.view.View.access$3100(View.java:785)
at android.view.View$PerformClick.run(View.java:25921)
我的适配器的 OnBind 方法:--
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.name.setText(arrayList.get(position).getaName());
holder.album.setText(arrayList.get(position).getaAlbum());
holder.imageView.setImageBitmap(BitmapFactory.decodeFile(arrayList.get(position).getAlbumart()));
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent in = new Intent(context,PlayerActivity.class);
in.putExtra("SONG",arrayList.get(position).getaName());
in.putExtra("PATH",arrayList.get(position).getaPath());
in.putExtra("ALBUM",arrayList.get(position).getaAlbum());
in.putExtra("LIST",arrayList);
in.putExtra("POSITION", arrayList.get(position).toString());
context.startActivity(in);
}
});
}
我的玩家活动:---
public class PlayerActivity extends AppCompatActivity {
TextView songanme, songAlbum,duration,movetime;
ImageView playbutton,nextbtn,previousbtn;
SeekBar seekBar;
MediaPlayer mediaPlayer ;
ArrayList<AudioModel> list;
int CURRENT_POSITION ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_player);
songanme = findViewById(R.id.music_name_pl);
movetime = findViewById(R.id.move_time);
seekBar = findViewById(R.id.seekBar);
songAlbum = findViewById(R.id.music_album_pl);
duration = findViewById(R.id.duration);
playbutton = findViewById(R.id.play_btn_pl);
nextbtn = findViewById(R.id.next_btn_pl);
previousbtn = findViewById(R.id.previous_pl);
list = new ArrayList<>();
songanme.setSelected(true);
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
list = (ArrayList) bundle.getParcelableArrayList("LIST");
}
假设您要将Song
ArrayList
中的一首 ArrayList 从 Activity1 传递到 Activity2。
1- Song
class 应该实现Serializable
class。
会是这样的..
import java.io.Serializable;
public class Song implements Serializable {
String name;
String album;
public Song(String name, String album) {
this.name = name;
this.album = album;
}
}
2-在Activity1
中将您的数组列表 object 作为附加项传递给Ativity2
ArrayList<Song> songs= new ArrayList();
songs.add(new Song("song1","album1"));
songs.add(new Song("song2","album2"));
songs.add(new Song("song3","album3"));
Intent intent=new Intent(this,Activity2.class);
intent.putExtra("songs",songs);
startActivity(intent);
3- 最后在Activity2
中使用getSerializableExtra
接收数组列表
ArrayList<Song> songs = (ArrayList<Song>) getIntent().getSerializableExtra("songs");
Log.i("HINT", "" + songs.size());
您可以创建一个 singleton class,以便在 android 的各个组件之间共享您的 ArrayList。singleton class 的示例代码如下所述 -
public class SongBank
{
private static SongBank instance;
private ArrayList<Song> songsArrayList;
private SongBank(Context context)
{
// You can do any stuff if you want here
}
// create getter and setter methods for your arrayList
public void setSongsList(ArrayList<Song> songs)
{
if(songs!=null)
{
this.songsArrayList=songs;
}
}
public ArrayList<Song> getSongsList()
{
return this.songsArrayList;
}
public static SongBank getInstance(Context context)
{
if(instance==null)
{
instance=new SongBank(context);
}
return instance;
}
}
这个 singleton class 的实例可以在各种活动或片段中调用,如果需要,您还可以在不同的活动中更改 Arraylist 的值。 您也可以拨打此电话 class 并在您的音乐服务中获取列表,而无需担心序列化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.