Android:从 ListView 一次播放一个媒体文件

标签 android listview media

我创建了一个 ListView ,其中包含 4 个要播放的媒体文件。如果我选​​择要播放的第一首歌曲,它正在播放,但如果我在 ListView 上选择第二首要播放的歌曲,那么两首歌曲都在播放,所以我希望如果第二首是选择播放然后首先需要停止,只需要播放第二首歌曲。请帮我解决这个问题......提前致谢。 下面是我的代码。 主要 Activity

public class MainActivity extends Activity implements AdapterView.OnItemClickListener {

private ArrayList<String> audioList;
private File file;
private ListView lvAudio;
private Context context;
private Adapter Adaptr;

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

    audioList = new ArrayList<String>();

    String root_sd = Environment.getExternalStorageDirectory().toString();
    file = new File( root_sd + "/EmoticApp/AudioFile/" ) ;
    File list[] = file.listFiles();

    for( int i=0; i< list.length; i++)
    {
        audioList.add( list[i].getName() );
    }

    getid();
    setListner();

    Adaptr = new Adapter(MainActivity.this,audioList);
    lvAudio.setAdapter(Adaptr);
}

private void setListner() {

    lvAudio.setOnItemClickListener(this);
}

private void getid() {

    lvAudio =(ListView)findViewById(R.id.lvAudio);
}

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


}

适配器代码:

public class Adapter extends BaseAdapter {


ArrayList<String> audioList;
Context context;
private static LayoutInflater inflater = null;
public boolean flag =false;

public Adapter(MainActivity mainActivity, ArrayList<String> audioList) {

    this.context = mainActivity;
    this.audioList = audioList;
}

@Override
public int getCount() {
    return audioList.size();
}

@Override
public Object getItem(int position) {
    return position;
}

@Override
public long getItemId(int position) {
    return position;
}

public class Holder {
    private ImageView imgIcon, imgPlay, imgPause, imgStop;
    private MediaPlayer mediaPlayer;
    private SeekBar seekbar;
    private TextView tvTotalTime,duration;
    private double timeElapsed = 0, finalTime = 0;
    private int forwardTime = 2000, backwardTime = 2000;
    private Handler durationHandler = new Handler();

    //handler to change seekBarTime
    private Runnable updateSeekBarTime = new Runnable() {
        public void run() {
            //get current position
            timeElapsed = mediaPlayer.getCurrentPosition();
            //set seekbar progress
            seekbar.setProgress((int) timeElapsed);

            tvTotalTime.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) finalTime), TimeUnit.MILLISECONDS.toSeconds((long) finalTime)));

            //set time remaing
            double timeRemaining = finalTime - timeElapsed;
            duration.setText(String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining), TimeUnit.MILLISECONDS.toSeconds((long) timeRemaining) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes((long) timeRemaining))));

            //repeat yourself that again in 100 miliseconds
            durationHandler.postDelayed(this, 100);
        }
    };
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    View myView = convertView;
    final Holder holder;

    if (myView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        myView = inflater.inflate(R.layout.video_adapter, null);

        holder = new Holder();
        holder.imgPlay = (ImageView) myView.findViewById(R.id.imgPlay);
        holder.imgPause = (ImageView) myView.findViewById(R.id.imgPause);
        holder.imgStop = (ImageView) myView.findViewById(R.id.imgStop);
        holder.seekbar =(SeekBar)myView.findViewById(R.id.seekbar);
        holder.tvTotalTime =(TextView)myView.findViewById(R.id.tvTotalTime);
        holder.duration =(TextView)myView.findViewById(R.id.duration);

        holder.seekbar.setClickable(true);

        holder.seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                if (fromUser) {
                    holder.mediaPlayer.seekTo(progress);
                }
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        String fileName = audioList.get(position);
        String path="/EmoticApp/AudioFile/";
        Log.e("Checking File:", "Checking=======:" + fileName);

        flag =true;

        holder.mediaPlayer = MediaPlayer.create(context, Uri.parse(Environment.getExternalStorageDirectory().getPath()+path + fileName));

        holder.imgPlay.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (flag == true) {

                    holder.mediaPlayer.start();
                    if (holder.mediaPlayer.isPlaying()) {
                        Toast.makeText(context, "Playing", Toast.LENGTH_LONG).show();
                        holder.imgPlay.setVisibility(View.INVISIBLE);
                        holder.imgPause.setVisibility(View.VISIBLE);
                        holder.timeElapsed = holder.mediaPlayer.getCurrentPosition();
                        holder.seekbar.setProgress((int) holder.timeElapsed);
                        holder.durationHandler.postDelayed(holder.updateSeekBarTime, 100);
                        holder.finalTime = holder.mediaPlayer.getDuration();
                        holder.seekbar.setMax((int) holder.finalTime);

                        Toast.makeText(context,"Playing",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        holder.imgPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                holder.mediaPlayer.pause();
                holder.imgPause.setVisibility(View.INVISIBLE);
                holder.imgPlay.setVisibility(View.VISIBLE);
            }
        });

        holder.mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {

                holder.imgPause.setVisibility(View.INVISIBLE);
                holder.imgPlay.setVisibility(View.VISIBLE);
            }
        });

        myView.setTag(holder);

        return myView;
    }

    return myView;
}

最佳答案

使用这行代码:

 MediaPlayer        mp = new MediaPlayer();

    playMySong(String songPath)
    {
        mp.reset();
        mp.setDataSource(songPath);
        mp.prepare();
        mp.start();
    }

关于Android:从 ListView 一次播放一个媒体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34118588/

相关文章:

audio - 如何按无声部分分割视频或音频

android - 播放 Activity 中的铃声突然停止

java - 如何使用默认的抽屉导航 Activity 将项目添加到 ActionBar 中

android - 如何了解Android应用程序中的各种 Activity

c# - Unity3D 新的 UI 系统和 ListView

Android:ListView,最后一项 - 显示更多

android - 将 ListView 滚动到顶部没有任何屏幕闪烁

android - 您如何在 Android 中获取/设置媒体音量(不是铃声音量)?

Android 重力开始/结束对阿拉伯文本没有影响?

android - 我在 eclipse 中的 android 模拟器无法启动