RecyclerView调用submitList后未填充数据问题求助
问题分析与解决:RecyclerView不显示数据
1. 核心问题:返回了未配置的新Binding实例
你的Fragment代码里犯了一个关键错误:你先创建了一个binding对象并完成了RecyclerView的配置,但最后返回的是重新inflate的全新Binding实例,导致之前的适配器设置、数据绑定全部失效。
看这段代码:
HomeFragmentBinding binding = HomeFragmentBinding.inflate(inflater); // 这里用该binding配置了rvProducts、适配器等 return HomeFragmentBinding.inflate(inflater).getRoot(); // 重新创建了一个未配置的Binding
修复方式:直接返回你初始化并配置好的那个Binding的根视图:
return binding.getRoot();
2. 其他潜在问题检查
(1) Product类需正确重写equals和hashCode
你的DiffUtil回调中使用oldItem.equals(newItem)判断内容是否一致,如果Product类没有重写equals方法,默认会用引用比较,导致DiffUtil无法识别数据变化,影响列表更新。
示例重写代码:
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Product product = (Product) o; return getId() == product.getId() && Objects.equals(getTitle(), product.getTitle()) && Objects.equals(getCategory(), product.getCategory()) && Objects.equals(getPrice(), product.getPrice()); } @Override public int hashCode() { return Objects.hash(getId(), getTitle(), getCategory(), getPrice()); }
(2) 价格字段类型适配
如果getPrice()返回的是int/double等数字类型,直接调用setText()会被Android当成资源ID处理,导致文本不显示甚至崩溃。需要转换为字符串:
// 替换原bind方法中的价格设置代码 binding.txtPriceProduct.setText(String.valueOf(itemProduct.getPrice())); // 如需格式化价格可改为: // binding.txtPriceProduct.setText(String.format("%.2f", itemProduct.getPrice()));
修复后的Fragment核心代码
@Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { // 建议加上container和attachToRoot参数,避免布局参数异常 HomeFragmentBinding binding = HomeFragmentBinding.inflate(inflater, container, false); tabLayout = binding.tabLayout; rvProducts = binding.rvProducts; setupRecyclerView(); viewModel.getAllProducts(); viewModel.products.observe(getViewLifecycleOwner(), products -> { Log.d("HSV", products.toString()); productsAdapter.submitList(products); }); return binding.getRoot(); }
内容的提问来源于stack exchange,提问作者Helvio Siqueira
相关产品推荐
相关产品推荐

