首页 > 解决方案 > ListView 适配器在滚动时切换搜索栏位置

问题描述

我正在开发带有三种不同聊天消息文本、照片和音频消息的聊天应用程序,我现在的问题是音频消息,它由按钮、文本视图和搜索栏组成,所以当按钮单击搜索栏和文本视图时会更新。

  //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 周,但没有任何帮助。

标签: android

解决方案


这是因为您正在使用 viewholder 回收视图。您的 postDelayed 方法不知道该视图现在已被回收并用于在 listView 中创建新的原始数据。

一种可能的解决方案是不回收您的视图,但是如果您的列表足够大,这可能效率不高。


推荐阅读