Android 为什么RecyclerView在没有notifyDataSetChanged()的情况下更新?

Android 为什么RecyclerView在没有notifyDataSetChanged()的情况下更新?,android,android-recyclerview,recyclerview-layout,Android,Android Recyclerview,Recyclerview Layout,当您更改RecyclerView适配器正在处理的数组以更新视图并反映所做的更改时,通常会调用notifyDataSetChanged()或notifyItemChanged()。但我编写了一个示例应用程序,在同一块中调用.setAdapter()后立即向数组中添加项时,这两个应用程序都不会被调用,并且视图会更新!当我试图通过按钮的onClickListener或从后台线程添加项目时(都需要notifyDataSetChanged才能更新视图),不会发生这种行为 这是怎么回事?在同一块中调用.se

当您更改RecyclerView适配器正在处理的数组以更新视图并反映所做的更改时,通常会调用
notifyDataSetChanged()
notifyItemChanged()
。但我编写了一个示例应用程序,在同一块中调用
.setAdapter()
后立即向数组中添加项时,这两个应用程序都不会被调用,并且视图会更新!当我试图通过按钮的
onClickListener
或从后台线程添加项目时(都需要
notifyDataSetChanged
才能更新视图),不会发生这种行为

这是怎么回事?在同一块中调用
.setAdapter()
后立即向列表中添加项目是否需要类似于
notifyDataSetChanged()
的内容

i、 e


如果您将
数组列表
传递给
适配器
,并在
onCreate
中添加元素,则在应用程序绘制第一帧之前

有时您可以添加元素,因为适配器没有布置项目

在您的
onClick
中,这将在
onCreate
完成后进行,这意味着
适配器已经布置好


您可以尝试移动
add(“c”)
onPostCreate
onResume
,您可能会看到与您的
onClick

类似的结果。您是否碰巧有一个来源或参考,用于您提到的“因为适配器没有布置项目”?@GrantPark否,我没有。这只是Android的生命周期,
onCreate
在实际布局之前。例如,如果您试图在
onCreate
中获取
RecyclerView
的高度/宽度,它将返回0。您可以查看类似的内容,这表明您可以在实际布局时得到一个回调。
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        myList.add("a");
        myList.add("b");
        recyclerView.setAdapter(adapter);
        myList.add("c"); // the recyclerView is updating and shows "c" here! why???

        findViewById(R.id.fab).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myList.add("e"); // the recyclerView will NOT update here unless you call `notifyDataSetChanged`
            }
        });

        ...