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

原文地址:https://www.cnblogs.com/zl1991/p/5355509.html