简体   繁体   中英

ListView adapter switches seekbars position while scrolling

I am developing chat app with three different chat messages text ,photo and audio messages my problem now with audio message which consists of button , textview and seekbar so when button clicked seekbar and textview get updated.

  //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);
                        }
                    }
                });

strong text

and i am updating my seekbar like this ...

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
                } 
            } 
        }
    }

strong text Now my seekbar gets updated right and reset to its normal as long as no scrolling but when ever scroll the screen other seekbars gets updated randomly i think i needed to update my seekbar only when it is visible and reset all visible seekbar progress to zero but i can not achieve this i have tried a lot for 2 weeks now but with no progress any help.

This is because you are recycling view using viewholder. Your postDelayed method doesn't know that the view is now recycled and used for creating a new raw in the listView.

One possible solution is to not recycle your views, which however may not be efficient in case your list is large enough.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM