Android - RecyclerView具有一个布局,多个setVisibility

时间:2016-03-31 07:38:25

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

我有一个基本上所有在一个布局,其中包含我的应用程序的主要所需的一切。所有可变项目(图像,视频缩略图等等)首先设置为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

1 个答案:

答案 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);
}

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