listview+seekbar问题的解决
最近做了个项目,其中有录音播放功能。每次录音结束都会在listView中显示,在listView中能播放每次的录音,也可以每条录音之间的切换播放。随之就引发了许多的问题,比如当我播放第一条录音的时所有的Seekbar都跟着动。我在listView用一个按钮控制播放与暂停,当第一次点击按钮时按钮的背景图片更换播放录音,第二次点击按钮时按钮的背景图片更换暂停录音。这又会引发其他的控件也会改变,一系列的问题。
解决问题的代码如下:
1 package net.ijoysoft.notes.adapter; 2 3 import java.io.File; 4 import java.text.SimpleDateFormat; 5 import java.util.ArrayList; 6 import java.util.Date; 7 import java.util.List; 8 import java.util.Timer; 9 import java.util.TimerTask; 10 11 import net.ijoysoft.notes.ui.NoteEditActivity; 12 import net.ijoysoft.notes.uti.Util; 13 14 import com.tools.enotes.R; 15 16 import android.content.Context; 17 import android.media.MediaPlayer; 18 import android.media.MediaPlayer.OnCompletionListener; 19 import android.net.Uri; 20 import android.os.Handler; 21 import android.test.UiThreadTest; 22 import android.util.Log; 23 import android.view.LayoutInflater; 24 import android.view.View; 25 import android.view.View.OnClickListener; 26 import android.view.ViewGroup; 27 import android.widget.BaseAdapter; 28 import android.widget.Button; 29 import android.widget.SeekBar; 30 import android.widget.SeekBar.OnSeekBarChangeListener; 31 import android.widget.TextView; 32 33 public class RecordListAdapter extends BaseAdapter { 34 public int thisPosition = -1; 35 public MediaPlayer mMediaPlayer = new MediaPlayer(); 36 public boolean isPlay = true; 37 public boolean isFiring = false; 38 public List<Integer> a = new ArrayList<Integer>(); 39 private Context context; 40 private LayoutInflater inflater; 41 private List<File> Mdata = null; 42 43 public RecordListAdapter(Context context, List<File> mdata) { 44 super(); 45 this.context = context; 46 Mdata = mdata; 47 inflater = LayoutInflater.from(context); 48 } 49 50 @Override 51 public int getCount() { 52 return Mdata == null ? 0 : Mdata.size(); 53 } 54 55 @Override 56 public Object getItem(int position) { 57 return Mdata.get(position); 58 } 59 60 @Override 61 public long getItemId(int position) { 62 return position; 63 } 64 65 private Timer timer; 66 67 @Override 68 public View getView(int position, View convertView, ViewGroup parent) { 69 final RecordViewHold holder; 70 final int sign = position; 71 if (convertView == null) { 72 convertView = inflater 73 .inflate(R.layout.data_record_list_item, null); 74 holder = new RecordViewHold(); 75 holder.record_play = (Button) convertView 76 .findViewById(R.id.note_play); 77 holder.record_seek = (SeekBar) convertView 78 .findViewById(R.id.note_seekBar); 79 holder.record_time = (TextView) convertView 80 .findViewById(R.id.note_time); 81 holder.record_delete = (Button) convertView 82 .findViewById(R.id.note_delete); 83 holder.record_play.setTag(sign); 84 convertView.setTag(holder); 85 } else { 86 holder = (RecordViewHold) convertView.getTag(); 87 } 88 Uri uri = Uri.fromFile(Mdata.get(sign)); 89 MediaPlayer mMediaPlayer1 = MediaPlayer.create(context, uri); 90 SimpleDateFormat format = new SimpleDateFormat("mm:ss"); 91 Date date = new Date(mMediaPlayer1.getDuration()); 92 String time = format.format(date); 93 holder.record_time.setText(time); 94 //控制控件背景图片的改变 95 switch (thisPosition) { 96 case -1: 97 98 break; 99 default: 100 if(thisPosition!= sign){ 101 holder.record_play 102 .setBackgroundResource(R.drawable.data_play); 103 } 104 break; 105 } 106 107 holder.record_play.setOnClickListener(new OnClickListener() { 108 109 @Override 110 public void onClick(View v) { 111 thisPosition = sign; 112 int tag = (Integer) v.getTag(); 113 Log.i("jjf", "tag的值" + tag); 114 Log.i("jjf", "sign的值" + sign); 115 //根据点击的item中的值判断是否是同一个按钮 116 if (a.size() != 0) { 117 if (a.get(0) != sign) { 118 mMediaPlayer.pause(); 119 isPlay = true; 120 isFiring = false; 121 if (timer != null) { 122 timer.cancel(); 123 timer = null; 124 } 125 } 126 } 127 if (isPlay) {// 播放录音 128 Uri uri = Uri.fromFile(Mdata.get(sign)); 129 a.clear(); 130 a.add(tag); 131 // 播放录音 132 mMediaPlayer = MediaPlayer.create(context, uri); 133 holder.record_seek.setMax(mMediaPlayer.getDuration()); 134 SimpleDateFormat format = new SimpleDateFormat("mm:ss"); 135 Date date = new Date(mMediaPlayer.getDuration()); 136 String time = format.format(date); 137 holder.record_time.setText(time); 138 isFiring = true; 139 mMediaPlayer.start(); 140 timer = new Timer(); 141 final Handler handler = new Handler(); 142 timer.schedule(new TimerTask() { 143 @Override 144 public void run() { 145 handler.post(new Runnable() { 146 @Override 147 public void run() { 148 if (isFiring) { 149 holder.record_seek.setProgress(mMediaPlayer 150 .getCurrentPosition()); 151 } 152 } 153 }); 154 155 } 156 }, 100, 100); 157 mMediaPlayer 158 .setOnCompletionListener(new OnCompletionListener() { 159 160 @Override 161 public void onCompletion(MediaPlayer mp) { 162 holder.record_play 163 .setBackgroundResource(R.drawable.data_play_default); 164 isPlay = true; 165 if (timer != null) { 166 timer.cancel(); 167 timer = null; 168 } 169 } 170 }); 171 172 holder.record_play 173 .setBackgroundResource(R.drawable.start_play_default); 174 isPlay = false; 175 } else { 176 mMediaPlayer.pause(); 177 holder.record_play 178 .setBackgroundResource(R.drawable.data_play_default); 179 isPlay = true; 180 isFiring = false; 181 if (timer != null) { 182 timer.cancel(); 183 timer = null; 184 } 185 } 186 //按钮点击发生变化重绘item 187 notifyDataSetChanged(); 188 } 189 }); 190 holder.record_seek 191 .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 192 193 @Override 194 public void onStopTrackingTouch(SeekBar arg0) { 195 } 196 197 @Override 198 public void onStartTrackingTouch(SeekBar arg0) { 199 } 200 201 @Override 202 public void onProgressChanged(SeekBar seekBar, 203 int progress, boolean fromUser) { 204 if (fromUser == true) { 205 // mMediaPlayer.seekTo(progress); 206 holder.record_seek.setProgress(progress); 207 holder.record_play 208 .setBackgroundResource(R.drawable.data_play_default); 209 } 210 } 211 }); 212 holder.record_delete.setOnClickListener(new OnClickListener() { 213 214 @Override 215 public void onClick(View v) { 216 217 Log.i("jjf", "Mdata的值:" + Mdata.size()); 218 Util.deleteFolder(Mdata.remove(sign)); 219 Log.i("jjf", "Mdata的值:" + Mdata.size()); 220 if (isFiring) { 221 mMediaPlayer.pause(); 222 } 223 notifyDataSetChanged(); 224 } 225 }); 226 227 return convertView; 228 } 229 public void stopMedia(){ 230 if (mMediaPlayer.isPlaying()) { 231 mMediaPlayer.pause(); 232 } 233 } 234 235 } 236 237 class RecordViewHold { 238 Button record_play, record_delete; 239 SeekBar record_seek; 240 TextView record_time; 241 }
转自:http://blog.csdn.net/dylan_null/article/details/41257441
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
ANDROID 开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了