我正在开发具有三种不同的聊天消息文本,照片和音频消息的聊天应用程序,现在我的问题是音频消息由按钮, textview 和seekbar组成,因此当单击按钮时,seekbar和textview会更新。
//global variables
Context context;
ImageLoader imageLoader;
private List<RowItem> items = null;
ViewHolder holder = null;
String audioFileURL;
ViewHolder clicked_holder = null;
private SeekBarUpdater seekBarUpdater;
MediaPlayer mediaPlayer;
public CustomListViewAdapter(Context context, int resourceId,
List<RowItem> items) {
super(context, resourceId, items);
this.context = context;
imageLoader = new ImageLoader(context);
this.items = items;
seekBarUpdater = new SeekBarUpdater();
}
private static class ViewHolder {
public com.example.truth.lang.messanger.RoundedImageView imageView;
public TextView msgText;
public TextView msgDate;
public SeekBar seekBar_message;
public ImageView play_audio;
public LinearLayout.LayoutParams params;
public LinearLayout.LayoutParams audioparams;
public LinearLayout linearLayout;
public LinearLayout audio_layout;
public RelativeLayout intermediate_bar;
public TextView audio_duration;
public TextView audio_date;
int pos;
}
//this is getView();
if (convertView == null) {
..... convertView.setTag(holder);
} else
holder = (ViewHolder) convertView.getTag();
RowItem rowItem = getItem(position);
holder = (ViewHolder) convertView.getTag();
holder.play_audio.setTag(holder);
holder.play_audio.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (items.get(position).getAudio_url() != null) {
try {
if (mediaPlayer != null&&clicked_holder!=null) {
//check if there any media playing
if(position!=clicked_holder.pos){
clicked_holder.seekBar_message.setProgress(0);
clicked_holder.play_audio.setImageResource(R.drawable.play_audio_icon_1);
clicked_holder.intermediate_bar.setVisibility(View.GONE);
clicked_holder.play_audio.setVisibility(View.VISIBLE);
clicked_holder = (ViewHolder) view.getTag();
clicked_holder.pos=position;
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer=(null);
}
clicked_holder.intermediate_bar.setVisibility(View.VISIBLE);
clicked_holder.play_audio.setVisibility(View.GONE);
mediaPlayer=new MediaPlayer();
audioFileURL = items.get(position).getAudio_url();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(audioFileURL);
} catch (IOException e) {
e.printStackTrace();
}
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
clicked_holder.play_audio.setImageResource(R.drawable.pause_audio_icon);
mp.start();
if (mp.isPlaying()) {
clicked_holder.intermediate_bar.setVisibility(View.GONE);
clicked_holder.play_audio.setVisibility(View.VISIBLE);
updatePlayingView();
}
}
});
}else{
mediaPlayer.stop();
mediaPlayer.reset();
clicked_holder.intermediate_bar.setVisibility(View.GONE);
clicked_holder.play_audio.setVisibility(View.VISIBLE);
clicked_holder.play_audio.setImageResource(R.drawable.play_audio_icon_1);
clicked_holder.seekBar_message.setProgress(0);
mediaPlayer=null;
clicked_holder=null;
}
} else {
clicked_holder = (ViewHolder) view.getTag();
clicked_holder.pos=position;
holder.seekBar_message.setTag(position);
clicked_holder.intermediate_bar.setVisibility(View.VISIBLE);
clicked_holder.play_audio.setVisibility(View.GONE);
mediaPlayer=new MediaPlayer();
audioFileURL = items.get(position).getAudio_url();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(audioFileURL);
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.prepareAsync();
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
clicked_holder.play_audio.setImageResource(R.drawable.pause_audio_icon);
mp.start();
if (mp.isPlaying()) {
clicked_holder.intermediate_bar.setVisibility(View.GONE);
clicked_holder.play_audio.setVisibility(View.VISIBLE);
updatePlayingView();
}
}
});
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
clicked_holder.play_audio.setImageResource(R.drawable.play_audio_icon_1);
mediaPlayer=null;
clicked_holder.seekBar_message.setProgress(0);
clicked_holder.play_audio.setImageResource(R.drawable.play_audio_icon_1);
Log.i("holderpositionupdate1", "media player");
updateNonPlayingView(clicked_holder);
clicked_holder=null;
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
Log.i("setOnErrorListener",""+what+" "+ extra);
return true;
}
});
}
} catch (IllegalArgumentException e1) {
e1.printStackTrace();
} catch (SecurityException e1) {
e1.printStackTrace();
}
}else {
clicked_holder.intermediate_bar.setVisibility(View.VISIBLE);
clicked_holder.play_audio.setVisibility(View.GONE);
}
}
});
强文本
我正在像这样更新我的搜索栏...
private void updateNonPlayingView(ViewHolder clicked_holder) {
clicked_holder.seekBar_message.removeCallbacks(seekBarUpdater);
clicked_holder.seekBar_message.setEnabled(true);
clicked_holder.seekBar_message.setProgress(0);
}
private void updatePlayingView() {
if(mediaPlayer!=null){
clicked_holder.seekBar_message.setMax(mediaPlayer.getDuration());
clicked_holder.seekBar_message.setProgress(mediaPlayer.getCurrentPosition());
clicked_holder.seekBar_message.setEnabled(true);
if (mediaPlayer.isPlaying()) {
clicked_holder.seekBar_message.postDelayed(seekBarUpdater, 100);
}
}else {
clicked_holder.seekBar_message.removeCallbacks(seekBarUpdater);
}
}
private class SeekBarUpdater implements Runnable {
@Override
public void run() {
if (clicked_holder!=null) {
if(mediaPlayer.isPlaying() ) {
clicked_holder.seekBar_message.postDelayed(this, 100);
//also update my textview with audio time left til finsish
}
}
}
}
强文本 现在,只要不滚动,我的搜索栏就会正确更新并重置为正常状态,但是每当滚动屏幕时,其他搜索栏就会随机更新,我想我只需要在可见的时候更新我的搜索栏并将所有可见的搜索栏进度重置为零,但是我无法实现这一点,我已经尝试了2周了很多,但没有任何帮助。
答案 0 :(得分:0)
这是因为您正在使用Viewholder回收视图。您的postDelayed方法不知道该视图现在已被回收并用于在listView中创建新的原始数据。
一种可能的解决方案是不回收您的视图,但是,如果您的列表足够大,这可能会无效。