RecyclerView OnBindViewHolder中ProgressBar设置view.GONE无效求助
RecyclerView onBindViewHolder中ProgressBar设置GONE无效的解决方法
嘿,我一眼就瞅出你代码里的核心问题了——你在onBindViewHolder里重新inflate了list_item布局!你新创建的这个view和RecyclerView复用的ViewHolder里的itemView根本不是同一个实例,你对着这个“假”布局里的ProgressBar设置可见性,自然不会影响到屏幕上实际显示的那个item。而TextView的设置可能是你后续误打误撞用了holder里的控件,才看起来正常。
给你一步步修正的方案:
1. 先把ViewHolder写对
ViewHolder的作用就是提前缓存item里的控件引用,避免每次绑定都重复findViewById,更不能在绑定的时候重新inflate布局。正确的ViewHolder应该是这样:
public class DataHolder extends RecyclerView.ViewHolder { // 直接在ViewHolder里声明要操作的控件 public TextView text; public ProgressBar progressBar; public DataHolder(View itemView) { super(itemView); // 从ViewHolder持有的itemView里找控件,这才是实际显示的布局 text = itemView.findViewById(R.id.textView6); progressBar = itemView.findViewById(R.id.progressBar2); } }
2. 修正onBindViewHolder逻辑
绑定的时候直接用holder里的控件,不要再搞什么新的inflate操作了:
@Override public void onBindViewHolder(DataHolder holder, int position) { ListItem item = listdata.get(position); // 直接操作holder中的ProgressBar,这才是当前显示的item对应的控件 holder.progressBar.setVisibility(View.GONE); // 同时设置TextView的内容,也用holder里的引用 holder.text.setText(item.getYourTextContent()); }
额外要检查的小细节
- 确认你的
list_item.xml布局里,ProgressBar的初始可见性没有被android:visibility固定住(比如设成了visible且被其他逻辑强制覆盖) - 如果是在异步任务(比如网络请求)完成后才要隐藏ProgressBar,记得调用
notifyItemChanged(position)通知RecyclerView刷新对应位置的item,不然控件状态不会更新
内容的提问来源于stack exchange,提问作者Robel
相关产品推荐
相关产品推荐

