单击另一个活动时如何发送自定义arraylist的列表项的数据?

Posted

技术标签:

【中文标题】单击另一个活动时如何发送自定义arraylist的列表项的数据?【英文标题】:How to send data of the list item of a custom arraylist when clicked to another activity? 【发布时间】:2019-12-05 09:55:54 【问题描述】:

我有一个自定义歌曲对象的数组列表,当单击列表视图的特定歌曲项时,我想将歌曲名称、艺术家姓名和专辑封面图像发送到另一个活动(歌曲活动)。我创建了一个 SongActivity 来显示用户选择的歌曲的正在播放屏幕。

(歌曲列表活动)这包含歌曲列表。

 public class SongsListActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.songs_list);
    ArrayList<Song> songs = new ArrayList<Song>();
            songs.add(new Song("Earthquake","Marshmello and TYNAN",R.mipmap.earthquake));
        .....

            final SongAdapter adapter = new SongAdapter(this, songs);


            ListView listView = findViewById(R.id.list);

            listView.setAdapter(adapter);

            ListView listview = (ListView) findViewById(R.id.list);
            listview.setOnItemClickListener(new AdapterView.OnItemClickListener() 
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) 

                    Intent intent = new Intent(view.getContext(), SongActivity.class);

                
            );

        
    

(SONG ACTIVITY)此活动在用户点击特定歌曲对象时开始

import androidx.appcompat.app.AppCompatActivity;

public class SongActivity extends AppCompatActivity 
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.song_activity);
        ImageView songImage = findViewById(R.id.songImage);
        TextView songName = findViewById(R.id.songName);
        TextView artistName = findViewById(R.id.artistName);

        Intent intent = getIntent();

        songImage.setImageResource(intent.getIntExtra("image",0));
        songName.setText(intent.getStringExtra("songName"));
        artistName.setText(intent.getStringExtra("artistName"));

    

(歌曲适配器)

public class SongAdapter extends ArrayAdapter 

    public SongAdapter(Activity context, ArrayList<Song> songs) 

        super(context, 0, songs);
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        // Check if the existing view is being reused, otherwise inflate the view
        View listItemView = convertView;
        if(listItemView == null) 
            listItemView = LayoutInflater.from(getContext()).inflate(
                    R.layout.list_item, parent, false);
        


        Song currentSong = (Song) getItem(position);

        TextView nameTextView = (TextView) listItemView.findViewById(R.id.song_name);

        nameTextView.setText(currentSong.getSongName());

        TextView artistTextView = (TextView) listItemView.findViewById(R.id.artist_name);

        artistTextView.setText(currentSong.getArtistName());

        ImageView iconView = (ImageView) listItemView.findViewById(R.id.song_icon);

        iconView.setImageResource(currentSong.getImageResourceId());

        return listItemView;
    


【问题讨论】:

你需要打包你的自定义模型,然后发送到使用意图。 intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, mMenuScreenShotList) 编辑你的问题检查一下。 【参考方案1】:

像这样分割你的模态

    public class Student implements Parcelable 

    private Integer rollno;
    private String name;
    private Integer age;


    protected Student(Parcel in) 

        age = in.readInt();
        name  = in.readString();
        rollno = in.readInt();

    

    public Student(Integer age, String name, Integer rollno) 
        this.age = age;
        this.name = name;
        this.rollno = rollno;
    


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

        @Override
        public Student[] newArray(int size) 
            return new Student[size];
        
    ;


    @Override
    public int describeContents() 
        return 0;
    

    public Integer getRollno() 
        return rollno;
    

    public void setRollno(Integer rollno) 
        this.rollno = rollno;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Integer getAge() 
        return age;
    

    public void setAge(Integer age) 
        this.age = age;
    



    public static Creator<Student> getCREATOR() 
        return CREATOR;
    


  @Override
    public void writeToParcel(Parcel parcel, int i) 

        parcel.writeInt(age);
        parcel.writeString(name);
        parcel.writeInt(rollno);


    

然后设置并使用intent

intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, studentList) 
intents.getParcelableArrayList<Student>(Intent.EXTRA_STREAM)

【讨论】:

我应该包裹哪个类?我应该如何调用它,以便我在 SongActivity 中获取歌曲名称、艺术家名称和相关图像,并让它分别显示 TextViews 和 ImageView。如果您能提供代码,那将非常有帮助。谢谢! 你需要打包你的歌曲模态类。【参考方案2】:

你的歌曲模型(类)应该是这样的

导入android.os.Parcel; 导入android.os.Parcelable; public final class Songs 实现 Parcelable 公共静态最终 Parcelable.Creator CREATOR = new Parcelable.Creator() @覆盖 public Songs createFromParcel(final Parcel source) 返回新歌(源); @覆盖 public Songs[] newArray(final int size) 返回新歌曲[大小]; ; 私有字符串歌曲名称; 私人字符串艺术家姓名; 私有整数 imageId; 公共歌曲() 公共歌曲(最终字符串歌曲名称,最终字符串艺术家姓名,最终整数图像ID) this.songName = 歌曲名; this.artistName = 艺术家名; this.imageId = imageId; 受保护的歌曲(最终包裹) this.songName = in.readString(); this.artistName = in.readString(); this.imageId = (Integer) in.readValue(Integer.class.getClassLoader()); 公共字符串 getSongName() 返回歌曲名称; 公共无效 setSongName(最终字符串歌曲名称) this.songName = 歌曲名; 公共字符串 getArtistName() 返回艺术家姓名; 公共无效setArtistName(最终字符串艺术家姓名) this.artistName = 艺术家名; 公共整数 getImageId() 返回图像标识; 公共无效 setImageId(最终整数 imageId) this.imageId = imageId; @覆盖 公共 int describeContents() 返回0; @覆盖 public void writeToParcel(final Parcel dest, final int flags) dest.writeString(this.songName); dest.writeString(this.artistName); dest.writeValue(this.imageId);

在你的SongListActivity

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() public void onItemClick(AdapterView parent, View view, int position, long id) Intent intent = new Intent(view.getContext(), SongActivity.class); intent.putExtra("SONG_DATA", songList.get(position)); 开始活动(意图); );

最后在你的SongActivity 中的onCreate() 中,你必须获得意图并获得类似的数据

if (getIntent() != null) 
    Song song = getIntent().getParcelableExtra("SONG_DATA");
    // now you have got song object, You can do rest of operations

【讨论】:

要使任何数据模型 Parcelable,只需在您的 android studio 中从 setting->Plugins 添加 Parcelable 插件。然后在您的数据类中只需按alt+insert 并选择Parcelable,插件将为您创建Parcelable 代码。 数据现在被传输,但是当我运行应用程序时它崩溃了。 java.lang.RuntimeException:无法启动活动 ComponentInfocom.example.musify/com.example.musify.MainActivity:java.lang.NullPointerException:尝试调用虚拟方法 'void android. widget.ListView.setOnItemClickListener(android.widget.AdapterView$OnItemClickListener)' 在空对象引用上 您的listView 为空。确保 findViewById(R.id.list); 不返回 null。

以上是关于单击另一个活动时如何发送自定义arraylist的列表项的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将一个自定义列表的选定数据显示到同一活动的另一个自定义列表视图

将包含其他自定义对象的对象列表从一个活动发送到另一个活动

如何将 ArrayList<Custom Object> 从一个活动传递到另一个活动? [复制]

如何在单击另一个视图(即按钮)时突出显示自定义列表视图

Android:如何将界面从一个活动发送到另一个活动

如何将多个图像发送到android中的另一个活动?