Android - RecyclerView 有一个布局,多个 setVisibility
Android - RecyclerView with one layout, multiple setVisibility
我有一个基本上是多合一的布局,其中包含我的应用程序的主要提要所需的一切。所有可变项(图片,视频缩略图..等)首先设置为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
我正在使用 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
);
如果没有从服务器获得 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);
}
如果您要在运行时设置它们的可见性,请对您作为列表项到达那里的每个项目执行此操作。
你在 onBindViewHolder()
中的所有 if
条件也必须有一个 else
块。
不要在没有 else
的情况下留下任何 if
条件。当 if
条件变为 false
.
时,您可以在 else
块中提供默认行为
我有一个基本上是多合一的布局,其中包含我的应用程序的主要提要所需的一切。所有可变项(图片,视频缩略图..等)首先设置为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
我正在使用 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
);
如果没有从服务器获得 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);
}
如果您要在运行时设置它们的可见性,请对您作为列表项到达那里的每个项目执行此操作。
你在 onBindViewHolder()
中的所有 if
条件也必须有一个 else
块。
不要在没有 else
的情况下留下任何 if
条件。当 if
条件变为 false
.
else
块中提供默认行为