我想在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;
}
答案 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
}
getView