【问题标题】:How to show and hide view in recycler view in Android?如何在 Android 的回收站视图中显示和隐藏视图?
【发布时间】:2017-08-01 18:26:36
【问题描述】:

在我的应用程序中,我正在使用回收站视图。我想在特定条件下显示和隐藏视图。但是当我滚动回收站视图时,我没有得到预期的行为。当我看到一个视图时,它对其他行也随机可见. 我的理解是,当它回收时它会重用视图,而当它回收的前一个视图时,它会找到该视图的可见性。如何在特定条件下隐藏视图?这是我的适配器代码

  @Override
public void onBindViewHolder(UrduRhymesViewHolder holder, int position) {
    RhymesModel current = mUrduRhymesList.get(position);
    AppUtility.setCustomFont(mContext, holder.tvUrduRhymesName, Constants.HANDLEE_REGULAR);
    holder.tvUrduRhymesName.setText(current.getRhymeName());
    holder.ivUrduRhymesLogo.setImageUrl(current.getThumbnailUrl(), mImageRequest);
    int status = AppUtility.getFavouriteStatus(mContext, current.getRhymeName(), new UrduRhymesDb(mContext));
    if (status == 0)
        holder.btnFavourite.setBackgroundResource(R.mipmap.btn_star_unactive);
    else
        holder.btnFavourite.setBackgroundResource(R.mipmap.btn_star);

    ProgressbarDetails progressbarDetails = ProgressbarDetails.getProgressDetail(current.getRhymeName());
    if (progressbarDetails == null) {
        progressbarDetails = new ProgressbarDetails();
        progressbarDetails.prgProgressBar = holder.pbRhymeDownload;
        progressbarDetails.download_btn_settings = holder.downloadButtonLayout;
    } else {
        progressbarDetails.prgProgressBar = holder.pbRhymeDownload;
        progressbarDetails.download_btn_settings = holder.downloadButtonLayout;
        holder.pbRhymeDownload.setProgress(progressbarDetails.progress);
    }

    ProgressbarDetails.addUpdateProgressDetail(current.getRhymeName(), progressbarDetails);

    if (progressbarDetails != null && progressbarDetails.isDownloading) {
        Log.e("test","downloading foe position "+position );
        holder.downloadButtonLayout.setBackgroundResource(R.mipmap.btn_download);
        holder.pbRhymeDownload.setVisibility(View.VISIBLE);
        holder.pbRhymeDownload.setProgress(progressbarDetails.progress);
    } else {
        Log.e("test","should not be visible for position "+position);
        holder.pbRhymeDownload.setVisibility(View.GONE);

    }
}

这里的progressbarDetails.isDownloading(值为true)是我想显示我的视图但不是隐藏我的视图的else子句的标准

编辑:这里 ProgressbarDetails (Singleton ) 是一个类,保持适配器进度条每一行的引用。

【问题讨论】:

  • 什么是progresbarDetails?请提供完整代码
  • 可以添加适配器代码吗?
  • 当我首先使用此代码检查可见性时,我在最后一个 else 子句中观察到的另一件事 if (holder.pbRhymeDownload.getVisibility() == View.VISIBLE) { Log.e("test", “可见的”); } else if(holder.pbRhymeDownload.getVisibility() == View.GONE){ Log.e("test","gone"); }else { Log.e("test","不知道");它说视图消失了,但在实际设备中我可以看到这个视图可见。背后的原因是什么?

标签: android


【解决方案1】:

没有直接隐藏和取消隐藏 recylerview 子项的方法。

解决方案: 让我们假设recyclerview适配器是ArrayList 现在制作另一个数组列表(temp_list)

场景:

隐藏:遍历您的适配器项目并删除您要隐藏的那些。将这些中的每一个放入 temp_list。迭代结束后,调用notifyDataSetChanged()

显示:遍历您的 temp_list 项目并删除您要显示的项目。将这些中的每一个放入适配器中。迭代结束后调用notifyDataSetChanged()

【讨论】:

    【解决方案2】:

    您应该在 viewHolder 中添加一个标志,指示该视图是否应该显示。并且每次在 onBindViewHolder 中检查这个标志。

    因为 recyclerView 重复使用相同的视图,所以您应该根据 viewHolder 中每个视图的特殊情况做出决定。

    【讨论】:

    • 你的意思是我需要先获取行(关于我需要显示我的视图可见的内容)然后在 onBindviewHolder() 方法中我应该先获取标签然后决定要做什么......是吗你在说。
    【解决方案3】:

    您的意思是您的数据何时更改? 你的布局想要改变吗?

    adapter.notifyDataSetChanged();
    

    【讨论】:

    • 不,数据没有改变我正在显示下载进度,但是当我滚动回收器视图时,它也开始显示其余行的进度条。(当我不下载时,它不应该是其他行可见)。最初进度条隐藏在 xml 布局文件中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多