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;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值