我有一个基本上是多合一的布局,其中包含我的应用的主要提要所需的一切。所有可变项(图像、视频缩略图等)首先设置为 GONE
,并在需要时设置为 VISIBLE
。
问题是有时,可能是由于 RecyclerView
的回收行为,应该是 GONE
的项目在 VISIBLE
错误的地方。
示例:
Item no 1 contains Text
Item no 2 contains Image
Item no 3 contains Image
我一直向下滚动到第 x 项,然后向上滚动,这就是我得到的:
Item no 1 contains Image from item no x, sometimes item no 3
Item no 2 contains Image
Item no 3 contains Image
我正在使用自定义 ViewHolder,它扩展了 RecyclerView.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
);
如果没有从服务器获取 url,我已将每个可见性设置为 GONE
((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE);
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE);
但不知何故,图像仍然在以前的项目上重复使用(是的,不仅是项目 1)。有时图像也在错误的 ImageView
中。图片 D 应该在 ImageView
D 中,但它在 ImageView
A 中。
是否有关于设置 RecyclerView
并正常运行的指南?
如果我遗漏了什么,或者需要提供更多代码,请务必通知我 :D
最佳答案
您还需要添加 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);
}
如果您要在运行时设置它们的可见性,请对您作为列表项到达那里的每个项目执行此操作。
关于java - Android - 具有一种布局、多个 setVisibility 的 RecyclerView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36327049/