Android Listview回收并显示重复的图像

Android Listview回收并显示重复的图像,android,listview,android-listview,Android,Listview,Android Listview,我已经创建了一个列表视图,其中包括曲目列表、播放和暂停图像。当单击播放图像时,暂停图像变为可见,然后单击暂停,播放图像将变为可见。问题是,当我单击播放并向下滚动时,我会看到另一个列表项显示暂停图像,而当我向下滚动更多列表项时,会看到另一个列表项显示暂停图像。这是因为列表引用了一个显示重复图像的列表。在研究该问题时,我认为我需要在getView方法中放置if-else语句,但我没有这样做实现正确的代码以解决此问题..plzz帮助我使用tht中的代码..在SoundCloud类中按名称isPlayi

我已经创建了一个列表视图,其中包括曲目列表、播放和暂停图像。当单击播放图像时,暂停图像变为可见,然后单击暂停,播放图像将变为可见。问题是,当我单击播放并向下滚动时,我会看到另一个列表项显示暂停图像,而当我向下滚动更多列表项时,会看到另一个列表项显示暂停图像。这是因为列表引用了一个显示重复图像的列表。在研究该问题时,我认为我需要在getView方法中放置if-else语句,但我没有这样做实现正确的代码以解决此问题..plzz帮助我使用tht中的代码..

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

SoundCloudList
获取对象,如下所示:

SoundCloug soundCloud = (SoundCloud) getItem(position);
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;
        }
    }

});
这个对象可以在您使用
soundcloudList.get(position)
的任何地方使用,这样做很容易,因为我们不必每次都获取对象

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

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
中,为
isplay
设置如下值:

SoundCloug soundCloud = (SoundCloud) getItem(position);
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
中每行的音频播放/暂停,然后才设置按钮的可见性

SoundCloud
是您自己制作的类吗?@DroidDev yeah……….您需要管理一个单独的布尔数组来定义imageview的可见性,当您单击该位置的按钮set true并根据该布尔数组值设置单击方法的可见性时。ok@user3753273继续。如果你需要解释,请告诉我。最好的:)查看我更新的问题代码,我根据您的答案尝试了。现在单击播放按钮不会更改图像。当我向下滚动然后再次向上滚动时,图像会随着视图刷新而更改,但sudio不会播放。问题是因为if-else循环仅在视图刷新时执行,而不是在点击按钮..plzz让我知道我哪里出错..我添加了soundcloud类也有问题..我在按照您所说的方式获取对象时也有问题..“soundcloud soundcloud=(soundcloud)getItem(position);”…哦..我忘了更新有问题的soundcloudadapter代码…现在请检查..问题在上一篇评论中提到了no@user3753273您做错了。请检查我的最新答案。这是正确的方法。非常感谢。。我还有一个问题,如果我点击多个播放按钮,多个音频开始播放。然后如果我尝试暂停多个音频,应用程序崩溃。。如何防止多个音频同时播放?如果你能帮到我,我很高兴。。