最近做了个项目,其中有录音播放功能。每次录音结束都会在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. BitTorrent Sync - 神奇的文件同步软件,无需服务器让多台电脑互相同步!

    176,487 微博 腾讯 空间 微信 141 49 如今人们对文件备份和同步的需求已经越来越强烈了.像 Dropbox 一样的云存储网盘有很多,但它们都有一个局限性,就是所有的文件都得经过它们的服务 ...

  2. php示例代码之使用MySQLi接口

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  3. char(10)和VARCHAR(10)主要的区别是什么?

    区别: 1.CHAR的长度是固定的,而VARCHAR2的长度是可以变化的, 如: 存储字符串“abc", 对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符), 而同样的 ...

  4. 十五天精通WCF——第十天 学会用SvcConfigEditor来简化配置

    我们在玩wcf项目的时候,都是自己手工编写system.serviceModel下面的配置,虽然在webconfig中做wcf的服务配置的时候,vs提供大多 数的代码提示,但对于不太熟悉服务配置的小鸟 ...

  5. mysql-mmm 安装配置(双主)

    原文地址:mysql-mmm 安装配置 作者:chinaunix1116 MMM即Master-Master Replication Managerfor MySQL(mysql主主复制管理器)关于m ...

  6. 说一下output子句

    Output子句日常灰常有用,而且用的地方也挺多,但是确好多时候被我们忽视,今天我就也简单扫盲一下这个语句的用法. Output子句 返回受 INSERT.UPDATE.DELETE 或 MERGE ...

  7. python scrapy+Mongodb爬取蜻蜓FM,酷我及懒人听书

    1.初衷:想在网上批量下载点听书.脱口秀之类,资源匮乏,大家可以一试 2.技术:wireshark scrapy jsonMonogoDB 3.思路:wireshark分析移动APP返回的各种连接分类 ...

  8. 如何在centos上安装epel源

    一.EPEL是什么? EPEL (Extra Packages for Enterprise Linux,企业版Linux的额外软件包) 是Fedora小组维护的一个软件仓库项目,为RHEL/Cent ...

  9. HowTo: Linux Server Change OR Setup The Timezone

    Method 1 #tzselect # select timezone e.g. Asia/Shanghai#echo 'Asia/Shanghai' > /etc/timezone # se ...

  10. hadoop日常运维与升级总结

    日常运维 升级 问题处理方法 日常运维 进程管理 由于配置文件的更改,需要重启生效, 或者是进程自己因某种致命原因终止, 或者发现进程工作出现异常等情况下,需要进行手动进程的关闭或启动, 或者是增删节 ...