[英]Error while passing data from clicked item in listview to another activity
[英]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.