最近做了个项目,其中有录音播放功能。每次录音结束都会在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. C# 依赖缓存

    使用轮询的方式 数据库: 在VS的命令里面输入 aspnet_regsql.exe -S (local) -U sa -P 123456 -d ERP_SQL -ed 上面这句是用来设置哪个服务器上的 ...

  2. 让我们喝喝下午茶,聊聊AJAX和JSON

    1.AJAX     [1] AJAX简介         > 全称:Asynchronous JavaScript And XML         > 直译:异步的JavaScript和 ...

  3. sql server 警报管理,实时监听数据库动向,运筹帷幄之中

    工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...

  4. Autofac全面解析系列(版本:3.5) – [使用篇(推荐篇):1.类型注册]

    前言 Autofac Autofac是一套高效的依赖注入框架. Autofac官方网站:http://autofac.org/ Autofac在Github上的开源项目:https://github. ...

  5. webkit浏览器常见开发问题

    前段时间有人问我一个简单的问题,html如何创建解析的? 我讲了一大堆,什么通过DocumentLoader, CachedResourceLoader, CacheResource, Resourc ...

  6. POJ2743Mobile Computing[DFS 状态压缩]

    Mobile Computing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 666   Accepted: 224   ...

  7. VS 代码Diff 之Beyone Compare

    前提条件 机器已安装 beyone compared软件和 visual svn for vs 插件. 在VS中集成SVN,我推荐使用 visual svn扩展. visual svn 官网:http ...

  8. TortoiseSVN status cache占用CPU高

    进程占用CPU高 每次从SVN上更新资源时,电脑都会卡死,直到资源更新完.当要Commit资源时,SVN也会卡死资源管理器,如下图所示: 解决占用CPU高的问题 1.禁用图标缓存 2.排除路径和包含路 ...

  9. 一行代码远离Google浏览器兼容问题的困扰

    跟Html相比,Web Flash开发的最大优势就在于兼容性好,因为FlashPlayer的开发商只有Adobe一家.但自从Google插了一脚进来,改版出自己的FlashPlayer以后,这一优势就 ...

  10. jquery的工具方法isFunction/isArray/isWindow/isNumeric/isPlainObject/isEmptyObject

    isFunction : 是否函数 isArray : 是否数组 isWindow : 是否window isNumeric : 是否数字 type : 数据类型方法 isPlainObject : ...