我有一个基本上所有在一个布局,其中包含我的应用程序的主要所需的一切。所有可变项目(图像,视频缩略图等等)首先设置为GONE
,并在需要时设置为VISIBLE
。
问题有时可能是由RecyclerView
的回收行为造成的,假定GONE
的项目在错误的地方VISIBLE
。
示例:
项目编号1包含文本
项目编号2包含图像
项目编号3包含图像
我一直向下滚动到第x项,然后向上滚动,这就是我得到的:
项目编号1包含项目编号x的图像,有时编号为项目编号3
项目编号2包含图像
项目编号3包含图像
我正在使用extends RecyclerView.ViewHolder
的自定义ViewHolder。
CustomViewHolder
的目的是用于布局声明和初始化。
ProgressBar progressBar;
View viewDimmer;
RelativeLayout postListWrapper;
...
public ObjectViewHolder(View v) {
super(v);
progressBar = (ProgressBar)v.findViewById(R.id.post_inscroll_progressBar);
viewDimmer = (View)v.findViewById(R.id.post_inscroll_viewDimmer);
postListWrapper = (RelativeLayout)v.findViewById(R.id.post_inscroll_postListWrapper);
}
我如何加载图片的示例:
Picasso.with(context)
.load(youtubeThumbnailUrl)
.fit()
.centerCrop()
.into(
((ObjectViewHolder) holder).userPostYoutubeImage
);
如果没有从服务器获取网址,我已将每次可见性设置为GONE
((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE);
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE);
但不知何故,图像仍然在之前的项目上重复使用(是的,不仅仅是第1项)。有时图像也是错误的ImageView
。图片D应该在ImageView
D中,但它会在ImageView
A中。
有关设置RecyclerView
并且运行良好的指南吗?
如果我遗漏了任何内容,或者需要提供更多代码,请告知我:D
答案 0 :(得分:6)
您还需要设置else
条件。像下面的例子。
// if no url is found from server
if(url == null){
((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE);
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE);
} else {
// Some url has found
((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.VISIBLE);
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.VISIBLE);
}
如果您在运行时设置了它们的可见性,请为列表中的每个项目执行此操作。