最近做了个项目,其中有录音播放功能。每次录音结束都会在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;
}

转自:http://blog.csdn.net/dylan_null/article/details/41257441

listview+seekbar问题的解决的更多相关文章

  1. C# 中DataGridView和ListView闪烁问题的解决方法

    C# 中DataGridView和ListView闪烁问题的解决方法 方法一首先定义类,将此类放在datagridview或ListView所在的窗体类外面,然后代码如下, <span styl ...

  2. Android ListView不响应OnItemClickListener解决办法

    有时候,当ListView中的每一个item是自定义的View时,有可能会导致ListView的OnItemClickListener的listener无法调用,请看如下情况: 如果你的自定义List ...

  3. ScrollView 与ListView 滑动冲突完美解决

    一.介绍ListView高度的设置方法 二.根据实际需求解决冲突问题 一.介绍ListView高度的设置方法 在ScrollView中使用ListView,ListView的高度会不正常. 方式一:在 ...

  4. ListView+CheckBox两种解决方式及原因分析

    近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量 ...

  5. ListView中CheckBox错乱解决

    思路: ListView在复用的时候会出现很多问题,CheckBox状态会出现错乱,解决思路: 1.使用Map集合的键值对的形式来存放position位置上CheckBox的状态 2.监听CheckB ...

  6. 关于ScrollView中嵌套listview焦点滑动问题 解决

    (第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...

  7. Android两级嵌套ListView滑动问题的解决

    Android下面两级嵌套ListView会出现滑动失效,解决方案,把两级Listview全换成NoScrollListView,代码如下: public class NoScrollListView ...

  8. 解决ScrollView嵌到listView冲突问题

    方法一: 把下面的方法放在绑定适配器操作的下面就行. /** * 重新计算ListView的高度,解决ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起冲突的问题 * @ ...

  9. 解决ScrollView中嵌套ListView滚动效果冲突问题

    在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样 式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查, ...

随机推荐

  1. 用GCD线程组与GCD信号量将异步线程转换为同步线程

    有时候我们会碰到这样子的一种情形: 同时获取两个网络请求的数据,但是网络请求是异步的,我们需要获取到两个网络请求的数据之后才能够进行下一步的操作,这个时候,就是线程组与信号量的用武之地了. #impo ...

  2. 【问题排查记录】Field 'id' doesn't have a default value;

    错误信息: org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [delete from t ...

  3. 荷兰国旗 Flag of the Kingdom of the Netherlands

    问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列 ...

  4. collections中可命名元组和队列

    一丶可命名元组(nametuple)

  5. 在MVC中使用Json.Net序列化和反序列化Json对象

    在.Net的MVC开发中,经常会使用到Json对象,于是,系统提供了JsonResult这个对象,其本质是调用.Net系统自带的Json序列化类JavaScriptSerializer对数据对象进行序 ...

  6. java:comp/env/jdbc/ 的两种配置方法

    1. 在 META-INF 下建立文件: context.xml <?xml version="1.0" encoding="UTF-8"?> &l ...

  7. 漏洞科普:对于XSS和CSRF你究竟了解多少

    转自:http://www.freebuf.com/articles/web/39234.html 随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广 ...

  8. 烂泥:puppet3.7安装与配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 有关服务器的自动化管理,这方面以前没有接触过.打算这段时间把这块知识给补上. 现在服务器自动化管理软件,使用最多也最火的就是puppet了. 那么我们今 ...

  9. 初识Hadoop入门介绍

    初识hadoop入门介绍 Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. < ...

  10. 警惕多iframe下的同名id引起的诡异问题

    遇到个诡异bug,虽然bug中套bug,忽略次要bug,其中最诡异最典型的现象是多行window.top.$("#id")取值操作,其中有一行却取不到值.这个着实让我费解.因为用到 ...