更改ListView的一个元素

时间:2016-03-19 23:16:57

标签: java android listview

我想在ListView的特定行中更改一个项目(ImageView)。现在我尝试通过onItemClickListener提供的视图来更改它以进行更改。它也有效!

但不知何故,当我向上和向下滚动其他listview行时,也会发生变化。我找到了关于问题"view recycling"的一些内容,但我真的没有找到解决方案。

有人可以帮忙吗?

修改: 这里有一些代码:

我的听众:

LV.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ...
        updateEQAnimation(position,view);
        ...
        }

应该改变它的功能

private void updateEQAnimation(int index, View view){

   ColorStateList sColorStatePlaying;
   ColorStateList sColorStateNotPlaying;

   sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary));

    if(view == null)
        return;
    AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song);
    ImageView EQ_ANIM = (ImageView) view.findViewById(R.id.imageView_eq_animation);
    EQ_ANIM.setVisibility(View.VISIBLE);
    EQ_ANIM.setImageDrawable(animation);
    EQ_ANIM.setImageTintList(sColorStatePlaying);
    animation.start();}

getView方法:

 @Override
public View getView(int position, View view, ViewGroup parent) {
    View rview = view;
    holder = null;

    if (rview == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        rview= inflater.inflate(R.layout.row_song, null, true);
        holder = new ViewHolder(rview);
        rview.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) rview.getTag();
    }

    mArtLoader.loadBitmap(AL_songlist.get(position).getAlbumArtPath(), holder.imgAlbumart);
    holder.txtTitle.setText(AL_songlist.get(position).getTitle());
    holder.txtArtist.setText(AL_songlist.get(position).getArtist());

    if(Main.songService.svc_mpcontroller != null && Main.global_music_controller != null) {
        if (AL_songlist.get(position).getID() == Main.global_music_controller.get_current_id()) {
            ColorStateList sColorStatePlaying;
            ColorStateList sColorStateNotPlaying;

            sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary));
            AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song);
            holder.imgEQAnimation.setVisibility(View.VISIBLE);
            holder.imgEQAnimation.setImageDrawable(animation);
            holder.imgEQAnimation.setImageTintList(sColorStatePlaying);
            animation.start();
        }
    }

    return rview;
}

1 个答案:

答案 0 :(得分:1)

首先,我将解释视图回收,然后我将解决您的问题。假设您一次可以在屏幕上看到8个列表项。当您向下滚动列表并且项目编号1关闭屏幕并且项目编号10出现在屏幕上时,项目编号10将重复使用项目编号1s视图。这意味着项目编号10看起来与项目编号1完全相同,除非您在适配器diff()方法中相应地更新它。

现在我们了解了View回收,您可以看到为什么其他商品会有你的新drawable,即使你没有点击它们。您必须在数据集中存储用于适配器的项目具有该图像的项目,无论它是适配器中的ArrayList还是适配器使用的自定义对象。然后在适配器的getView中,您可以执行以下操作:

getView

编辑: 您应该在if(hasImage) { ColorStateList sColorStatePlaying; ColorStateList sColorStateNotPlaying; sColorStatePlaying = ColorStateList.valueOf(context.getResources().getColor(R.color.colorPrimary)); AnimationDrawable animation = (AnimationDrawable) ContextCompat.getDrawable(context, R.drawable.anim_current_song); ImageView EQ_ANIM = (ImageView) view.findViewById(R.id.imageView_eq_animation); EQ_ANIM.setVisibility(View.VISIBLE); EQ_ANIM.setImageDrawable(animation); EQ_ANIM.setImageTintList(sColorStatePlaying); animation.start(); } else { // Set the default image }

中添加else语句
getView