为什么我不需要使用Adapter.notifyDataSetChanged()?

在执行readContacts()方法之前contactsList是空的,换句话说,当contactsView.setAdapter(adapter)被执行时, contactsList是空的,为什么这个代码仍然可以正确显示联系人的信息?

 public class MainActivity extends AppCompatActivity { ListView contactsView; ArrayAdapter<String> adapter; List<String> contactsList = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); contactsView = (ListView) findViewById(R.id.contacts_list); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactsList); contactsView.setAdapter(adapter); readContacts(); } private void readContacts() { Cursor cursor = null; try { cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME )); String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER )); contactsList.add(displayName + "\n" + number); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } } } 

但如果我添加这样的东西,我必须调用notifyDataSetChanged()

  add.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { contactsList.add("blabla"); adapter.notifyDataSetChanged(); } }); 

add是button。 现在,android会自动调用该方法,为什么在删除adapter.notifyDataSetChanged(); 用户界面无法刷新?

Solutions Collecting From Web of "为什么我不需要使用Adapter.notifyDataSetChanged()?"

重点是,你是在一个订单input数据,即当你在列表中推入一个项目它一路下来,你没有input它在第四,第五任何随机指标,所以你不必调用notifyDataSetChanged()因为它的定义本身就是这样说的: 一些数据已经改变了,或者任何反映数据集的视图都应该刷新自己,使新数据在列表中可见 ,因为在这种情况下,数据超出了可见列表的范围,在列表中显示的子数,所以它(ListView)总是在列表视图中特定的最后显示的索引值(item)之后调用下一个视图。

希望我对你有点清楚…!

++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++在编辑问题之后回答问题,然后在这方面进行search并有自己的想法和理解:

在第一种情况下, VIEW没有需要改变。 如果这一点很清楚,那就来第二个吧。 首先,您从数据库中获取数据,然后在列表中添加一个项目,然后在设置适配器之后填充它。 适配器没有设置,直到整个方法执行完成列表..! 好。

但在第二种情况下,你正在改变视图(几乎所有的东西都是视图在Android中),所以你正在操作视图通过添加已经填充的视图(已经设置适配器)的另一个项目,所以这次你需要告诉观点,嘿,我已经添加了一个项目,现在刷新自己,然后更新列表(即显示)。

该方法在Android框架内部调用。 你不必明确地调用它。

来源: https : //www.udacity.com/course/developing-android-apps–ud853

除了莉莉的回答,如果你写自己的适配器,你必须明确地调用它。