最近做了个项目,其中有录音播放功能。每次录音结束都会在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. 学习Coding-iOS开源项目日志(二)

    继续前篇:<学习Coding-iOS开源项目日志(一)>,接着本第二篇<学习Coding-iOS开源项目日志(二)>讲解Coding-iOS开源项目. 前言:作为初级程序员,想 ...

  2. Tomcat+Nginx+Lvs部署方案与性能调优

    立项要求:用户登录并发数达到1000vuser.原项目设计没有Nginx和LVS,经过性能测试并发数最高到400,就报响应超时,且系统资源消耗严重.经过和架构师商议决定先加入Nginx解决负载均衡处理 ...

  3. DOTA2参数收集

    -language schinese 显示中文界面(使用英文语音的同学使用) -perfectworld 登陆国服(Steam平台) -novid 不显示启动动画

  4. iOS开发进阶

    <iOS开发进阶>基本信息作者: 唐巧 出版社:电子工业出版社ISBN:9787121247453上架时间:2014-12-26出版日期:2015 年1月开本:16开页码:268版次:1- ...

  5. WebApi深入学习--概述+路由查找

    如何创建Controller这里就不说了,只写一些可能是高阶知识的内容 关于WebApi的官方介绍及示例 http://www.asp.net/web-api/ 1.跨域 Asp.NET有专门的跨域扩 ...

  6. ibatis动态多条件查询及模糊查询(oracle,mysql,sql)

    首先是模糊查询的问题,开始时我使用如下条件:select * from user where name like '%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是 ...

  7. RabbitMQ入门教程——.NET客户端使用

    众所周知RabbitMQ使用的是AMQP协议.我们知道AMQP是一种网络协议,能够支持符合要求的客户端应用和消息中间件代理之间进行通信. 其中消息代理扮演的角色就是从生产者那儿接受消息,并根据既定的路 ...

  8. oracle11G使用DGbroker创建dg

    1.环境: a.主机环境:centos6.5 b.软件环境:oracle 11.2.0.4 c.主机信息: DG1:192.168.100.51(数据库sid:atest) DG2:192.168.1 ...

  9. tomcat常用配置

    一. 增加内存,防止JVM内存溢出 1. 以服务的方式启动时 进入"tomcat安装路径\bin"目录下,打开service.bat文件,找到"--JvmOptions ...

  10. Linux 下子线程的 pthread_cleanup_push() 和 pthread_cleanup_pop() 研究

    线程退出前可能有一些清理工作,但是这部分代码又不会放到线程主体部分,就需要挂接一个或者几个线程“清洁工”来做这部分事情.需要这对兄弟: #include<pthread.h> void p ...