Android RecyclerView.add()正在工作,初始化适配器后未调用.notifyDataSetChanged()

Android RecyclerView.add()正在工作,初始化适配器后未调用.notifyDataSetChanged(),android,android-recyclerview,android-adapter,Android,Android Recyclerview,Android Adapter,在我的适配器中,为什么.add可以工作,即使我已经设置了适配器 mFilePathImages = new ArrayList<>(); mGridAdapter = new HomeGridAdapter(mContext, mFilePathImages); mGridRecycler.setLayoutManager(gridLayoutManager); mGridRecycler.setAdapter(mGridAdapter); mFilePathImages.

在我的适配器中,为什么.add可以工作,即使我已经设置了适配器

mFilePathImages = new ArrayList<>();
mGridAdapter = new HomeGridAdapter(mContext, mFilePathImages);    
mGridRecycler.setLayoutManager(gridLayoutManager);
mGridRecycler.setAdapter(mGridAdapter);

mFilePathImages.add("https://i.redd.it/lawrnev8v8o41.jpg");
mFilePathImages.add("https://i.imgur.com/GQXyo34.jpg");

任何人都知道是什么导致了这个问题

我可以假设这是由于这个代码

mFilePathImages.add("https://i.redd.it/lawrnev8v8o41.jpg");
mFilePathImages.add("https://i.imgur.com/GQXyo34.jpg");

执行速度快于为recyclerView创建视图的过程开始,因此不需要调用notifyDataSetChanged。因此,它可以工作,但不是每次都可以工作,因此您应该调用notifyDataSetChanged

Java总是按值传递。不幸的是,当我们传递对象的值时,我们传递的是对它的引用,就像您在这里所做的那样:

 new HomeGridAdapter(mContext, mFilePathImages); 
因此,无论何时更改mFilePathImages数组,它都会影响适配器

要获得更好的澄清,请参见以下答案:

为了避免这种情况,您应该在拥有最终数据或任何运行时更改后传递数组。对于适配器,使列表最初为空

当您有最终数据时,将其作为以下格式发送到适配器:

public void updateData(ArrayList<String> list) {
    if (list!= null) {
        this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
    }
}

适配器只有在你滚动时才会更新吗?@ShahoodulHassan我甚至没有滚动。我只添加了两项来测试适配器。代码不是自上而下执行的吗?为什么会这样呢?不,onBindViewHolder会根据需要执行,这样您就可以在绘图过程开始之前添加列表项。我可能错了,但我认为这是唯一的选择。你可以使用调试器并测试我的理论。我刚刚尝试在初始化适配器后添加100个图像,但仍然有效,因此我怀疑这是在设置2秒延迟之前运行代码在新线程中添加元素并报告结果的原因
public void updateData(ArrayList<String> list) {
    if (list!= null) {
        this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
    }
}