繁体   English   中英

如何将整个 Arraylist 传递给另一个活动

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM