Android 在回收器视图项中动态完成时视图未隐藏

Android 在回收器视图项中动态完成时视图未隐藏,android,Android,我正在使用RecyclerView列出项目,并在每个列表中显示一个动态可见/消失的图像。我正在使用View.GONE隐藏视图 在应该隐藏图像的情况下,图像不总是工作。它仍然显示在屏幕上,并且在调试模式下,我已经检查过了,当得到 image.getVisiblity()它给了我int值“8”,这意味着视图已消失,但我仍然可以在该列表中看到该图像。 这只是偶尔发生 我尝试使用View.INVISIBLE,它一直在工作,但它占用了布局中的空间,这是意料之中的 我正在使用sparseArray存储所有h

我正在使用
RecyclerView
列出项目,并在每个列表中显示一个动态可见/消失的图像。我正在使用
View.GONE
隐藏视图

在应该隐藏图像的情况下,图像不总是工作。它仍然显示在屏幕上,并且在调试模式下,我已经检查过了,当得到
image.getVisiblity()
它给了我int值
“8”
,这意味着视图已消失,但我仍然可以在该列表中看到该图像。 这只是偶尔发生

我尝试使用
View.INVISIBLE
,它一直在工作,但它占用了布局中的空间,这是意料之中的

我正在使用
sparseArray
存储所有
holders类
。我已在适配器中编写了一个方法,并从活动中调用该方法。我正在尝试隐藏
replayIcon
视图

public void handleReplayButton(int pos,Boolean isDisplay) {

   Holder holder = holderSparseArray.get(pos);

   if(holder != null) {
       if (isDisplay != null && isDisplay == true) {
           holder.playIcon.setVisibility(View.GONE);
           holder.pauseIcon.setVisibility(View.GONE);
           holder.replayIcon.setVisibility(View.VISIBLE);
       } else if(isDisplay != null && isDisplay == false) {
           holder.playIcon.setVisibility(View.VISIBLE);
           holder.pauseIcon.setVisibility(View.GONE);
           holder.replayIcon.setVisibility(View.GONE);
       } else {
           holder.playIcon.setVisibility(View.GONE);
           holder.pauseIcon.setVisibility(View.VISIBLE);
           holder.replayIcon.setVisibility(View.GONE);
       }
   }
}

这里是最后一个
else语句
我想要的,它正在将视图设置为GONE。当我调用
holder.replayIcon.getVisibility()
时,它给了我int 8,但我仍然可以看到图标

,你必须调用它来刷新回收器视图中的列表

但是,由于您必须删除项目,因此也可以使用

另外,如果您使用
setVisibility()
方法隐藏视图,那么请确保还将有效项目的视图设置为可见,因为项目在回收器视图中重复使用

有关更多信息:

您必须调用以刷新“回收器”视图中的列表

但是,由于您必须删除项目,因此也可以使用

另外,如果您使用
setVisibility()
方法隐藏视图,那么请确保还将有效项目的视图设置为可见,因为项目在回收器视图中重复使用


有关更多信息:

请尝试在一条语句末尾调用invisible,使其可见,反之亦然


您还可以尝试放置notifydatasetchanged()。

尝试在一条语句的末尾调用invisible,使其可见,反之亦然

您还可以尝试放置notifydatasetchanged()。

如果您将调用notifydatasetchanged()-它将更新列表中的所有项目。 如果需要按索引更新特殊项,请不要这样做,因为重新绘制所有视图需要大量内存

相反,就像在使用notifyItemChanged()、notifyItemInserted()或notifyItemRemoved()之前写的那样

如果要更新两个视图,可以使用notifyItemRangeChanged()、notifyItemRangeRemoved()或notifyItemRangeInserted()

还有一种方法。您可以使用DiffUtils回调

这是一个很好的动画制作方法

如果调用notifyDataSetChanged()-它将更新列表中的所有项目。 如果需要按索引更新特殊项,请不要这样做,因为重新绘制所有视图需要大量内存

相反,就像在使用notifyItemChanged()、notifyItemInserted()或notifyItemRemoved()之前写的那样

如果要更新两个视图,可以使用notifyItemRangeChanged()、notifyItemRangeRemoved()或notifyItemRangeInserted()

还有一种方法。您可以使用DiffUtils回调

这是一个很好的动画制作方法


发布相关代码我认为,您面临一些逻辑错误。如果您发布相关的代码片段,特别是RecyclerAdapter类,这会更好。您如何隐藏您的ImageView?可能是
onBindViewHolder
方法将其重写为可见?你能分享你的适配器代码吗?发布相关代码我想,你正面临一些逻辑错误。如果您发布相关的代码片段,特别是RecyclerAdapter类,这会更好。您如何隐藏您的ImageView?可能是
onBindViewHolder
方法将其重写为可见?能否共享适配器代码?如果只想更新一项,调用notifyDataSetChanged()是一种不好的方法。重新绘制所有视图需要大量内存。检查我上面的答案。如果只想更新一项,那么调用notifyDataSetChanged()是一种错误的方法。重新绘制所有视图需要大量内存。请检查上面的我的答案。请检查我的代码,您可以找到它。此外,我不想删除项目,我希望视图隐藏在列表中的单个项目中。请检查我的代码,您可以找到它。此外,我不想删除项目,我希望视图隐藏在列表中的单个项目中。