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;
}
转自:http://blog.csdn.net/dylan_null/article/details/41257441
listview+seekbar问题的解决的更多相关文章
- C# 中DataGridView和ListView闪烁问题的解决方法
C# 中DataGridView和ListView闪烁问题的解决方法 方法一首先定义类,将此类放在datagridview或ListView所在的窗体类外面,然后代码如下, <span styl ...
- Android ListView不响应OnItemClickListener解决办法
有时候,当ListView中的每一个item是自定义的View时,有可能会导致ListView的OnItemClickListener的listener无法调用,请看如下情况: 如果你的自定义List ...
- ScrollView 与ListView 滑动冲突完美解决
一.介绍ListView高度的设置方法 二.根据实际需求解决冲突问题 一.介绍ListView高度的设置方法 在ScrollView中使用ListView,ListView的高度会不正常. 方式一:在 ...
- ListView+CheckBox两种解决方式及原因分析
近期在用ListView+CheckBox搞一个item选中的项目,我将CheckBox的focus设置为false,另我大喜的是,CheckBox居然能够选中(窃喜中),这么简单就搞定了,由于数据量 ...
- ListView中CheckBox错乱解决
思路: ListView在复用的时候会出现很多问题,CheckBox状态会出现错乱,解决思路: 1.使用Map集合的键值对的形式来存放position位置上CheckBox的状态 2.监听CheckB ...
- 关于ScrollView中嵌套listview焦点滑动问题 解决
(第三种,第四种简单推荐使用) 在这里我要提出的是,listview能滚动的前提是:当listview本身的高度小于listview里的子view. 第一种方法 只需在MainActivity中 找到 ...
- Android两级嵌套ListView滑动问题的解决
Android下面两级嵌套ListView会出现滑动失效,解决方案,把两级Listview全换成NoScrollListView,代码如下: public class NoScrollListView ...
- 解决ScrollView嵌到listView冲突问题
方法一: 把下面的方法放在绑定适配器操作的下面就行. /** * 重新计算ListView的高度,解决ScrollView和ListView两个View都有滚动的效果,在嵌套使用时起冲突的问题 * @ ...
- 解决ScrollView中嵌套ListView滚动效果冲突问题
在ScrollView中嵌套使用ListView,ListView只会显示一行到两行的数据.起初我以为是样式的问题,一直在对XML文件的样 式进行尝试性设置,但始终得不到想要的效果.后来在网上查了查, ...
随机推荐
- Android开发框架--AndroidAnnotations(一)
annotation:注解 什么是框架 框架是基石 android开发中哪些内容可以做成框架呢 网络模块 图片缓存模块 数据库模块 UI基础模块 开发框架给我们带来了哪些好处 提升开发效率 代码简洁 ...
- sshd安装
centos yum install openssh-server #chkconfig --level 2345 sshd on #service sshd restart 重新启动 #netsta ...
- 十大广泛使用的Linux发行版
回到上世纪90年代,Mandrake Linux还是唯一的Linux发行版:而今天,Linux发行版的数量变得数不胜数.本文为大家整理出了十大广泛使用的Linux发行版,希望能帮助大家在选择合适的Li ...
- HTML5离线存储原理
找到一篇介绍离线缓存的,感觉比之前看到的解释的更透彻,新的知识点记录如下: 大家都知道Web App是通过浏览器来访问的,所以离线状态下是无法使用app的.其中web app中的一些资源并不经常改变, ...
- java中实现定时功能
网上资料: 我们可以使用Timer和TimerTask类在java中实现定时任务,详细说明如下: 1.基础知识java.util.Timer一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务 ...
- ofbiz 本地化及邮件设置126邮箱
ofibz登陆功能有通过电子邮件找会密码的功能,但找回密码功能需要配置一个发送email的邮箱账号和smtp服务器的配置,具体配置如下: 1:在ofbiz数据库的表product_store_emai ...
- [20140928]创建连接到MySQL的连接服务器
首先要安装 mysql odbc 然后 odbc下创建DSN,并且要在系统DSN下. 最后执行 exec sp_addlinkedserver @server= 'XY', --这是链 ...
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- C++/CLI——读书笔记《Visual C++/CLI从入门到精通》 第Ⅱ部分
=================================版权声明================================= 版权声明:本文为博主原创文章 未经许可不得转载 请通过右 ...
- linux 分区 物理卷 逻辑卷
今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...