当你改变由RecyclerView适配器处理的数组时,调用notifyDataSetChanged()
或notifyItemChanged()
是为了更新视图并反映所做的更改。但是我创建了一个示例应用程序,当我在同一个块中调用.setAdapter()
后立即向数组添加项目时,两个都没有被调用,并且视图更新!当我尝试通过按钮的onClickListener
或后台线程添加项目时都不会发生这种情况(两者都需要notifyDataSetChanged
才能更新视图)。
这里发生了什么?在同一块中调用.setAdapter()
之后,不应该立即将项添加到列表中需要像notifyDataSetChanged()
这样的东西吗?
即
@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`
}
});
...
如果你将ArrayList
传递给你的Adapter
,并且你在onCreate
中添加了元素,那就是在应用程序绘制你的第一帧之前。
有一段时间你可以添加元素,因为适配器没有布置项目。
在你的onClick
内,这将是在onCreate
完成后,这意味着adapter
已经布局。
您可以尝试将add("c");
移动到onPostCreate
或onResume
,您可能会看到与onClick
类似的结果。