【问题标题】:Android - RecyclerView with one layout, multiple setVisibilityAndroid - 具有一种布局、多种 setVisibility 的 RecyclerView
【发布时间】:2016-07-19 12:45:58
【问题描述】:

我有一个基本上多合一的布局,其中包含我的应用程序主要提要所需的一切。所有变量项(图片、视频缩略图等)一开始都设置为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
    );

如果没有从服务器获取 url,我将每个可见性设置为 GONE

((ObjectViewHolder) holder).userPostImageWrapper.setVisibility(View.GONE);
((ObjectViewHolder) holder).userPostYoutubeImageWrapper.setVisibility(View.GONE);

但不知何故,图像仍然在以前的项目上重复使用(是的,不仅仅是第 1 项)。有时图像也是错误的ImageView。图像 D 应该在 ImageView D 中,但它却在 ImageView A 中。

任何设置RecyclerView 并顺利进行的指南?

如果我遗漏了什么,或者需要提供更多代码,请告诉我:D

【问题讨论】:

    标签: java android android-recyclerview android-view visibility


    【解决方案1】:

    您还需要输入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);
    }
    

    如果您在运行时设置它们的可见性,请对您作为列表项获得的每个项目执行此操作。

    【讨论】:

    • 也许值得一提的是为什么这很重要。原因是持有人被重复使用。
    • 我只是被打了耳光。感谢 Reaz 告诉我使用 else 并感谢 @Knossos 告诉我持有人被重复使用!因此,即使我们移至 1 号持有人,持有人编号 3 内的可见性仍然存在?
    • @Knossos 非常感谢您的添加。是的,这值得分享。
    • @KevinMurvie 正确。重用从 RecyclerView 末尾弹出的 Holders 比创建新的 Holders 更有效。因此,每当您在 Holder 中设置属性时,它将保留该属性以供下次使用。所以需要重置为默认值。
    • 好吧,我目前在需要默认重置的地方添加else。但是我的方法是否正确?就像只使​​用一个布局一样..
    【解决方案2】:

    onBindViewHolder() 中的所有 if 条件也必须有一个 else 块。

    不要在没有else 的情况下留下任何if 条件。当if 条件变为false 时,您可以在else 块中提供默认行为。

    【讨论】:

      猜你喜欢
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2017-08-09
      • 1970-01-01
      相关资源
      最近更新 更多