Listview recycles and shows duplicated images

浪尽此生 提交于 2019-12-02 10:06:47

Create a new boolean variable in your SoundCloud class by the name isPlaying. Create getter setters for it, like you have done for other variables.

Get the object from SoundCloudList like this:

SoundCloug soundCloud = (SoundCloud) getItem(position);

This object can be used everywhere you are using soundcloudList.get(position), so that makes it easy to because we don't have to fetch object everytime.

Then in your getView use isPlaying to show play/pause button on every position like below:

if(soundCloud.isPlaying()){
    holder.img1.setVisibility(View.VISIBLE);
    holder.img2.setVisibility(View.GONE);
}
else{
    holder.img1.setVisibility(View.GONE);
    holder.img2.setVisibility(View.VISIBLE);
}

and then in your onClickListeners, set values for isPlaying like this:

holder.img1.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(final View v) {

        soundCloud.setPlaying(true);
        try {
            notifyDataSetChanged();
            holder.img1.setVisibility(View.INVISIBLE);
            holder.img2.setVisibility(View.VISIBLE);
            mMediaPlayer = new MediaPlayer();
            mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mMediaPlayer.setDataSource("http://api.soundcloud.com/tracks/" + soundcloudList.get(position).getId() + "/stream?client_id=e13865f9debacb5f96375fdd96b7fa1b");
            mMediaPlayer.prepareAsync();
            mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()
            {
                @Override
                public void onPrepared(MediaPlayer mp)
                {
                    mp.start();

                }
            });
            mMediaPlayer.setOnCompletionListener(
                    new MediaPlayer.OnCompletionListener()
                    {
                        @Override
                        public void onCompletion(MediaPlayer mp)
                        {
                            mMediaPlayer.release();
                            mMediaPlayer = null;
                            holder.img1.setVisibility(View.VISIBLE);
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

});

holder.img2.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(final View v)
    {
        soundCloud.setPlaying(false);
        notifyDataSetChanged();
        holder.img1.setVisibility(View.VISIBLE);
        holder.img2.setVisibility(View.INVISIBLE);
        if(mMediaPlayer!=null)
        {
            mMediaPlayer.release();
            mMediaPlayer = null;
        }
    }

});

This code will not show the play/pause button duplicated on multiple rows, because now, we are checking the play/pause of audio for every row in getView and only then setting the buttons visibility.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!