Listview回收并显示重复的图像

时间:2014-11-13 06:45:39

标签: android listview android-listview

我创建了一个列表视图,其中包含曲目列表,播放和暂停图像。当点击播放图像时,暂停图像变为可见并点击暂停,播放图像将变得可见。问题是当我点击播放时向下滚动我看到另一个列表项显示暂停图像,当我向下滚动更多另一个列表项显示暂停图像。这是因为列表重新显示一个显示重复的图像。在研究问题我想我需要在getView中放置if-else语句方法,但我没有实现正确的代码来解决这个问题.plzz帮助我解决这个问题..

1 个答案:

答案 0 :(得分:1)

SoundCloud类中使用名称isPlaying创建一个新的布尔变量。为它创建getter setter,就像你为其他变量所做的那样。

SoundCloudList获取对象:

SoundCloug soundCloud = (SoundCloud) getItem(position);

此对象可以在您使用soundcloudList.get(position)的任何位置使用,因此可以轻松实现,因为我们不必每次都获取对象。

然后在getView中使用isPlaying在每个位置显示播放/暂停按钮,如下所示:

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

然后在onClickListeners中,设置isPlaying的值,如下所示:

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

});

此代码不会显示多行上重复播放/暂停按钮,因为现在,我们正在检查getView中每一行的音频播放/暂停,然后才设置按钮可见性。