我有一個 ListView 活動,顯示我的原始檔案中的歌曲串列,當我單擊其中一個 ListView 時,它將相應地播放歌曲,但如果我第二次單擊它只會再次重播同一首歌曲。如何在同一軌道上暫停和再次恢復?以下是我到目前為止所做的代碼。
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView musicListView;
private Trackmodel[] tracklist;
private TrackAdapter adapter;
private MediaPlayer mediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
musicListView = findViewById(R.id.musicListView);
loadTracks();
musicListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
loadTracks();
Trackmodel track = tracklist[i];
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
track.setPlaying(false);
}
}
try {
mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
track.setPlaying(false);
} else {
mediaPlayer.start();
track.setPlaying(true);
}
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
});
}
public void loadTracks() {
tracklist = new Trackmodel[]{
new Trackmodel(R.raw.decode, "Paramore - Decode", false),
new Trackmodel(R.raw.thats_what_you_get, "Paramore - That's What You Get", false),
new Trackmodel(R.raw.starstrukk, "30H!3 - Starstrukk", false),
new Trackmodel(R.raw.we_are_young, "30H!3 - We Are Young", false)
};
adapter = new TrackAdapter(MainActivity.this, tracklist);
musicListView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
}
}
}}
TrackModel.java
package com.example.myapplication;
public class Trackmodel {
private int id;
private String name;
private boolean isPlaying;
public Trackmodel(int id, String name, boolean isPlaying) {
this.id = id;
this.name = name;
this.isPlaying = isPlaying;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isPlaying() {
return isPlaying;
}
public void setPlaying(boolean playing) { isPlaying = playing; }
}
TrackAdapter.java
package com.example.myapplication;
import android.content.Context;
import android.view.ContentInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class TrackAdapter extends BaseAdapter {
private Context context;
private Trackmodel[] tracks;
TrackAdapter(Context context, Trackmodel[] tracks) {
this.context = context;
this.tracks = tracks;
}
@Override
public int getCount() {
return tracks.length;
}
@Override
public Object getItem(int i) {
return tracks[i];
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
Trackmodel track = (Trackmodel) getItem(i);
ViewHolder holder;
if (view == null) {
view = LayoutInflater.from(context).inflate(R.layout.track_item, viewGroup, false);
holder = new ViewHolder();
holder.trackImage = view.findViewById(R.id.track_image);
holder.titleText = view.findViewById(R.id.track_title);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.titleText.setText(track.getName());
if (track.isPlaying()) {
holder.trackImage.setImageResource(R.drawable.ic_baseline_pause_circle);
} else {
holder.trackImage.setImageResource(R.drawable.ic_baseline_play_circle);
}
return view;
}
static class ViewHolder {
ImageView trackImage;
TextView titleText;
}
}
track_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@ id/sound_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingLeft="16sp"
android:paddingTop="10dp"
android:paddingRight="16sp">
<ImageView
android:id="@ id/track_image"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_centerVertical="true"
android:padding="5dp"
app:tint="@android:color/black" />
<TextView
android:id="@ id/track_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="56dp"
android:textAppearance="@style/TextAppearance.AppCompat.Body2" />
</RelativeLayout>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<ListView
android:id="@ id/musicListView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
uj5u.com熱心網友回復:
在您的專案單擊中,您停止MediaPlayer但之后,您每次都創建一個新實體。你有一個 if 檢查,它檢查是否MediaPlayer正在播放并停止它。之后,您創建一個new MediaPlayer并再次執行相同的檢查。那么當你第一次點擊時會發生什么?第一個if檢查沒有執行,因為你的mediaplayer為空,它創建一個新的mediaplayer并開始播放。第二次單擊后,您的第一次if檢查正在執行,因為您的 MediaPlayer 不為空且isPlaying為真。您停止它,創建一個新實體MediaPlayer并再次播放它。這就是為什么在單擊所有下一次之后,您只需重播歌曲。因為單擊時您會停止歌曲,創建一個新實體并播放它。
所以你在這里需要什么,我假設你的串列中有不同的曲目,當你點擊另一個曲目時,你需要停止上一個曲目并開始新的曲目。但是,如果您單擊同一曲目,則要暫停它。
在這種情況下,您需要正在播放/播放的當前曲目 ID。下次點擊后,如果曲目ID與正在播放的曲目相同,則只需暫停即可。如果它是另一個軌道,停止它并開始新的軌道。這是下面的代碼,您可以進行相應的更改并將其應用于您的代碼。
int currentTrackId = -1;
musicListView.setOnItemClickListener(
(AdapterView.OnItemClickListener) (adapterView, view, i, l) -> {
loadTracks();
Trackmodel track = tracklist[i];
if (currentTrackId != -1 && track.getId() == currentTrackId) {
// That was the same song, just pause it.
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
track.setPlaying(false);
} else {
mediaPlayer.start();
track.setPlaying(true);
}
}
} else {
// That's another song, stop the previous one and start the new one
currentTrackId = track.getId();
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.reset();
}
try {
mediaPlayer = MediaPlayer.create(MainActivity.this, track.getId());
mediaPlayer.start();
track.setPlaying(true);
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/485455.html
