listview+seekbar问题的解决

最近做了个项目,其中有录音播放功能。每次录音结束都会在listView中显示,在listView中能播放每次的录音,也可以每条录音之间的切换播放。随之就引发了许多的问题,比如当我播放第一条录音的时所有的Seekbar都跟着动。我在listView用一个按钮控制播放与暂停,当第一次点击按钮时按钮的背景图片更换播放录音,第二次点击按钮时按钮的背景图片更换暂停录音。这又会引发其他的控件也会改变,一系列的问题。

解决问题的代码如下:

package net.ijoysoft.notes.adapter;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import net.ijoysoft.notes.ui.NoteEditActivity;
import net.ijoysoft.notes.uti.Util;

import com.tools.enotes.R;

import android.content.Context;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri;
import android.os.Handler;
import android.test.UiThreadTest;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class RecordListAdapter extends BaseAdapter {
	public int thisPosition = -1;
	public MediaPlayer mMediaPlayer = new MediaPlayer();
	public boolean isPlay = true;
	public boolean isFiring = false;
	public List<Integer> a = new ArrayList<Integer>();
	private Context context;
	private LayoutInflater inflater;
	private List<File> Mdata = null;

	public RecordListAdapter(Context context, List<File> mdata) {
		super();
		this.context = context;
		Mdata = mdata;
		inflater = LayoutInflater.from(context);
	}

	@Override
	public int getCount() {
		return Mdata == null ? 0 : Mdata.size();
	}

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

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

	private Timer timer;

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		final RecordViewHold holder;
		final int sign = position;
		if (convertView == null) {
			convertView = inflater
					.inflate(R.layout.data_record_list_item, null);
			holder = new RecordViewHold();
			holder.record_play = (Button) convertView
					.findViewById(R.id.note_play);
			holder.record_seek = (SeekBar) convertView
					.findViewById(R.id.note_seekBar);
			holder.record_time = (TextView) convertView
					.findViewById(R.id.note_time);
			holder.record_delete = (Button) convertView
					.findViewById(R.id.note_delete);
			holder.record_play.setTag(sign);
			convertView.setTag(holder);
		} else {
			holder = (RecordViewHold) convertView.getTag();
		}
		Uri uri = Uri.fromFile(Mdata.get(sign));
		MediaPlayer mMediaPlayer1 = MediaPlayer.create(context, uri);
		SimpleDateFormat format = new SimpleDateFormat("mm:ss");
		Date date = new Date(mMediaPlayer1.getDuration());
		String time = format.format(date);
		holder.record_time.setText(time);
		//控制控件背景图片的改变
		switch (thisPosition) {
		case -1:
			
			break;
		default:
			if(thisPosition!= sign){
				holder.record_play
				.setBackgroundResource(R.drawable.data_play);
			}
			break;
		}
		
		holder.record_play.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				thisPosition = sign;
				int tag = (Integer) v.getTag();
				Log.i("jjf", "tag的值" + tag);
				Log.i("jjf", "sign的值" + sign);
				//根据点击的item中的值判断是否是同一个按钮
				if (a.size() != 0) {
					if (a.get(0) != sign) {
						mMediaPlayer.pause();
						isPlay = true;
						isFiring = false;
						if (timer != null) {
							timer.cancel();
							timer = null;
						}
					}
				}
					if (isPlay) {// 播放录音
						Uri uri = Uri.fromFile(Mdata.get(sign));
						a.clear();
						a.add(tag);
						// 播放录音
						mMediaPlayer = MediaPlayer.create(context, uri);
						holder.record_seek.setMax(mMediaPlayer.getDuration());
						SimpleDateFormat format = new SimpleDateFormat("mm:ss");
						Date date = new Date(mMediaPlayer.getDuration());
						String time = format.format(date);
						holder.record_time.setText(time);
						isFiring = true;
						mMediaPlayer.start();
						timer = new Timer();
						final Handler handler = new Handler();
						timer.schedule(new TimerTask() {
							@Override
							public void run() {
								handler.post(new Runnable() {
									@Override
									public void run() {
										if (isFiring) {
											holder.record_seek.setProgress(mMediaPlayer
													.getCurrentPosition());
										}
									}
								});

							}
						}, 100, 100);
						mMediaPlayer
								.setOnCompletionListener(new OnCompletionListener() {

									@Override
									public void onCompletion(MediaPlayer mp) {
										holder.record_play
												.setBackgroundResource(R.drawable.data_play_default);
										isPlay = true;
										if (timer != null) {
											timer.cancel();
											timer = null;
										}
									}
								});

						holder.record_play
								.setBackgroundResource(R.drawable.start_play_default);
						isPlay = false;
					} else {
						mMediaPlayer.pause();
						holder.record_play
								.setBackgroundResource(R.drawable.data_play_default);
						isPlay = true;
						isFiring = false;
						if (timer != null) {
							timer.cancel();
							timer = null;
						}
					}
					//按钮点击发生变化重绘item
					notifyDataSetChanged();
				}		
		});
		holder.record_seek
				.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

					@Override
					public void onStopTrackingTouch(SeekBar arg0) {
					}

					@Override
					public void onStartTrackingTouch(SeekBar arg0) {
					}

					@Override
					public void onProgressChanged(SeekBar seekBar,
							int progress, boolean fromUser) {
						if (fromUser == true) {
							// mMediaPlayer.seekTo(progress);
							holder.record_seek.setProgress(progress);
							holder.record_play
									.setBackgroundResource(R.drawable.data_play_default);
						}
					}
				});
		holder.record_delete.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				Log.i("jjf", "Mdata的值:" + Mdata.size());
				Util.deleteFolder(Mdata.remove(sign));
				Log.i("jjf", "Mdata的值:" + Mdata.size());
					if (isFiring) {
						mMediaPlayer.pause();
				}
				notifyDataSetChanged();
			}
		});

		return convertView;
	}
	public void stopMedia(){
		if (mMediaPlayer.isPlaying()) {
			mMediaPlayer.pause();
		}
	}

}

class  RecordViewHold {
	Button record_play, record_delete;
	SeekBar record_seek;
	TextView record_time;
}


 

很抱歉,作为AI语言模型,我无法为您编写完整的Android应用程序。但是,我可以提供一些初步的代码来帮助您开始。 1. 创建一个MainActivity类,继承自AppCompatActivity。 ``` public class MainActivity extends AppCompatActivity { //在这里定义各种变量和组件 //... } ``` 2. 在MainActivity的onCreate()方法中初始化各种组件,如ListViewSeekBar。 ``` @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView listView = findViewById(R.id.listView); SeekBar seekBar = findViewById(R.id.seekBar); //在这里对ListViewSeekBar进行初始化 //... } ``` 3. 在res/layout文件夹下创建activity_main.xml文件,定义主界面布局。 ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true"/> </RelativeLayout> ``` 4. 创建一个MusicPlayer类,用于管理音乐播放。 ``` public class MusicPlayer { private Context context; private ExoPlayer exoPlayer; private int currentTrackIndex; public MusicPlayer(Context context) { this.context = context; exoPlayer = ExoPlayerFactory.newSimpleInstance(context); currentTrackIndex = 0; } public void play() { //在这里实现播放音乐的逻辑 } public void pause() { //在这里实现暂停音乐的逻辑 } public void stop() { //在这里实现停止音乐的逻辑 } public void next() { //在这里实现播放下一首歌曲的逻辑 } public void previous() { //在这里实现播放上一首歌曲的逻辑 } } ``` 5. 在MainActivity中创建一个MusicPlayer对象,并在相应的按钮点击事件中调用MusicPlayer的方法。 ``` public class MainActivity extends AppCompatActivity { private ListView listView; private SeekBar seekBar; private MusicPlayer musicPlayer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = findViewById(R.id.listView); seekBar = findViewById(R.id.seekBar); musicPlayer = new MusicPlayer(this); //在这里为ListViewSeekBar设置适配器和监听器 //... } public void onPlayClick(View view) { musicPlayer.play(); } public void onPauseClick(View view) { musicPlayer.pause(); } public void onStopClick(View view) { musicPlayer.stop(); } public void onNextClick(View view) { musicPlayer.next(); } public void onPreviousClick(View view) { musicPlayer.previous(); } } ``` 6. 将音乐文件放在assets/music目录下,并在MusicPlayer中读取音乐文件。 ``` public class MusicPlayer { private Context context; private ExoPlayer exoPlayer; private int currentTrackIndex; public MusicPlayer(Context context) { this.context = context; exoPlayer = ExoPlayerFactory.newSimpleInstance(context); currentTrackIndex = 0; } public void play() { Uri uri = Uri.parse("asset:///music/" + getTrackName(currentTrackIndex)); MediaSource mediaSource = new ExtractorMediaSource.Factory(new DefaultDataSourceFactory(context, "user-agent")) .createMediaSource(uri); exoPlayer.prepare(mediaSource); exoPlayer.setPlayWhenReady(true); } //在这里实现getTrackName()方法,用于获取当前歌曲的文件名 //... public void pause() { exoPlayer.setPlayWhenReady(false); } public void stop() { exoPlayer.stop(); } public void next() { currentTrackIndex++; play(); } public void previous() { currentTrackIndex--; play(); } } ``` 这些代码只是一个简单的示例,您需要根据具体情况进行修改和扩展。希望这些代码能够帮助您入门Android开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值