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 块中提供默认行为