【问题标题】:Listview recycles and shows duplicated imagesListview 回收并显示重复的图像
【发布时间】:2014-11-13 06:45:38
【问题描述】:

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

【问题讨论】:

  • SoundCloud 是你自己制作的课程吗?
  • @DroidDev 是的............
  • 您需要管理一个单独的布尔数组来定义 imageview 的可见性,当您单击该位置的按钮设置为 true 并根据该布尔数组值设置单击方法的可见性时。跨度>

标签: android listview android-listview


【解决方案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 中每一行的音频播放/暂停,然后才设置按钮的可见性。

【讨论】:

  • 好的@user3753273 继续。如果您需要任何解释,请联系我。一切顺利:)
  • 查看我根据您的回答尝试过的更新代码。现在单击播放按钮不会更改图像。当我向下滚动然后再次向上滚动时,图像确实得到了随着视图刷新但sudio不播放而更改..问题是因为if-else循环仅在视图刷新时执行而不是在我们单击按钮时执行..plzz让我知道我哪里出错了..我已经添加soundcloud 类也有问题..我也无法按照您所说的方式获取对象..“SoundCloud soundCloud = (SoundCloud) getItem(position);”..
  • 哦..我忘了更新有问题的 soundcloudadapter 代码...现在查看..最后一条评论中提到了问题
  • no @user3753273 你做错了。请检查我更新的答案。这是正确的做法。
  • 非常感谢......我遇到的另一个问题是,如果我点击多个播放按钮,多个音频开始播放。然后如果我尝试暂停多个音频应用程序崩溃..如何防止多个音频同时播放?很高兴你能帮我解决这个问题..
猜你喜欢
  • 2014-06-19
  • 2021-04-14
  • 1970-01-01
  • 2011-01-08
  • 2016-08-09
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多