繁体   English   中英

将关联到 ListView 单元格的数据传递给项目的另一个活动 onClick()

[英]Passing the data associated to a ListView cell to another activity onClick() of the item

我是安卓编程的新手。 我正在使用ListView和自定义布局编写一个简单的音乐应用程序。 列表中的每一行都有两个用于歌曲名称和艺术家名称的TextView's

我有两个活动,MainActivity 和 nowPlaying Activity,nowPlaying Activity 上的列表也有两个TextView's . 我想要实现的是,当我单击ListView上的一个项目(在主活动中)时,我想获取歌曲名称艺术家姓名并将其设置为 nowPlaying 活动中的TextView's

主要活动

public class MainActivity extends AppCompatActivity {

ListView listView;
ArrayList<Songs> song;

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

    song = new ArrayList<Songs>();
    song.add(new Songs("Shape of you", "ed sheeran", "4:59"));
    song.add(new Songs("Energy", "avelino", "3:15"));
    song.add(new Songs("Wages", "bad sounds", "2:56"));
    song.add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    song.add(new Songs("Faded Heart", "Borns", "4:59"));
    song.add(new Songs("King Ruby", "ider", "4:59"));
    song.add(new Songs("Drown", "kovic", "4:59"));
    song.add(new Songs("Supercut", "lorde", "4:59"));
    song.add(new Songs("&Run", "sir sly", "4:59"));
    song.add(new Songs("Live in the moment", "portugal. the man", "4:59"));

    SongAdapter adapter = new SongAdapter(this, song);

    listView = findViewById(R.id.list_view);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = findViewById(R.id.song_name);
            TextView artistName = findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("name", listView.getItemAtPosition(i).toString());
            startActivity(intent);
        }
    });
    listView.setAdapter(adapter);
}

}

歌曲适配器

public class SongAdapter extends ArrayAdapter<Songs> {


public SongAdapter(Activity context, ArrayList<Songs> song) {
    // Here, we initialize the ArrayAdapter's internal storage for the context and the list.
    // the second argument is used when the ArrayAdapter is populating a single TextView.
    // Because this is a custom adapter for two TextViews and an ImageView, the adapter is not
    // going to use this second argument, so it can be any value. Here, we used 0.
    super(context, 0, song);
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    //return super.getView(position, convertView, parent);
    View listItemView = convertView;
    if (listItemView == null) {
        listItemView = LayoutInflater.from(getContext()).inflate(
                R.layout.song_item, parent, false);
    }

    Songs currentSong = getItem(position);

    TextView songName = listItemView.findViewById(R.id.song_name);
    songName.setText(currentSong.getSongName());

    TextView artistName = listItemView.findViewById(R.id.artist);
    artistName.setText(currentSong.getArtistName());

    TextView time = listItemView.findViewById(R.id.time);
    time.setText(currentSong.geTime());

    return listItemView;
}
}

截屏

在屏幕截图(上面给出)中,每一行都有一个歌曲名称和另一个艺术家名称。 单击该行时,我想获取名称并将其设置在其他活动上,并对艺术家姓名执行相同操作。

我希望ListView每个项目都发生这种情况。

歌曲类

public class Songs {
private String mSongName;
private String mArtistName;
private String mTime;

public Songs(String songName, String artistName, String Time) {
    mSongName = songName;
    mArtistName = artistName;
    mTime = Time;
}

public String getSongName() {
    return mSongName;
}
public String getArtistName() {
    return mArtistName;
}

public String geTime() {
    return mTime;
}

}

注意只需使用songName和artistName的getter和setter制作Songs模型类,并通过意图在NowPlayingActivcty中获取数据

public class MainActivity extends AppCompatActivity {

ListView listView;
ArrayList<Songs> song;

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

  final song = new ArrayList<Songs>();
    song.add(new Songs("Shape of you", "ed sheeran", "4:59"));
    song.add(new Songs("Energy", "avelino", "3:15"));
    song.add(new Songs("Wages", "bad sounds", "2:56"));
    song.add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    song.add(new Songs("Faded Heart", "Borns", "4:59"));
    song.add(new Songs("King Ruby", "ider", "4:59"));
    song.add(new Songs("Drown", "kovic", "4:59"));
    song.add(new Songs("Supercut", "lorde", "4:59"));
    song.add(new Songs("&Run", "sir sly", "4:59"));
    song.add(new Songs("Live in the moment", "portugal. the man", "4:59"));

    SongAdapter adapter = new SongAdapter(this, song);

    listView = findViewById(R.id.list_view);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = findViewById(R.id.song_name);
            TextView artistName = findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("songName", listView.get(i).getsongName());
            intent.putExtra("artistName", listView.get(i).getartistName());
            startActivity(intent);
        }
    });
    listView.setAdapter(adapter);
}

你在做正确的事情,你需要添加的只是演员的名字和艺术家,然后从第二个活动中取回他们

这里如何修复 onClick 如果您需要发送歌曲对象搜索如何将您的歌曲类转换为可打包

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
       String song_name= song.get(i).getSongName().toString();
        Intent intent = new Intent(MainActivity.this, nowPlaying.class);
        intent.putExtra("name",song_name );
        startActivity(intent);
    }
});
enter code here

通过歌曲名称或艺术家名称更改此 (listView.getItemAtPosition(i).toString())。

并在您的第二个活动中获得它。

您想将一些数据(在您的情况下歌曲名称艺术家姓名)传递给其他活动。 因此,这可以通过通过意图传递所需数据来实现,因为意图是消息传递对象,您可以将小块数据包装到它们中以在活动之间传递。 所以相同的代码是:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            TextView songName = view.findViewById(R.id.song_name);
            TextView artistName = view.findViewById(R.id.artist);
            Intent intent = new Intent(MainActivity.this, nowPlaying.class);
            intent.putExtra("song_name", songName.getText().toString());
            intent.putExtra("artist_name", artistName.getText().toString());
            startActivity(intent);
        }
    });

在onItemClick()方法给出的观点是被点击视图(通过适配器返回),所以你得到它的内容和直传它的其他活动,因为它是。

替代方式:

您无法访问onItemCLick() 中歌曲列表(歌曲数组列表),除非它声明为final 因此,您可以按如下方式声明并访问它:

final ArrayList<Songs> songs = new ArrayList<Songs>() {{
    add(new Songs("Shape of you", "ed sheeran", "4:59"));
    add(new Songs("Energy", "avelino", "3:15"));
    add(new Songs("Wages", "bad sounds", "2:56"));
    add(new Songs("L'Hiver Indien", "baloji", "3:28"));
    add(new Songs("Faded Heart", "Borns", "4:59"));
    add(new Songs("King Ruby", "ider", "4:59"));
    add(new Songs("Drown", "kovic", "4:59"));
    add(new Songs("Supercut", "lorde", "4:59"));
    add(new Songs("&Run", "sir sly", "4:59"));
    add(new Songs("Live in the moment", "portugal. the man", "4:59"));
}}

现在您可以使用此歌曲列表在onItemClick() 方法中获取数据,如下所示:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Intent intent = new Intent(MainActivity.this, nowPlaying.class);
                intent.putExtra("song_name", songs.get(i).getSongName()); // Note: If the getters are not set to get the song name and artist name then they need to be set to use this approach
                intent.putExtra("artist_name", songs.get(i).getArtistName());
                startActivity(intent);
            }
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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