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

Yri*_*uns 9 android android-listview android-adapter notifydatasetchanged

在方法执行contactsList之前是空的readContacts(),换句话说,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();
        }
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果我添加这样的东西,我必须打电话notifyDataSetChanged():

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

add是按钮.既然android会自动调用该方法,为什么在删除adapter.notifyDataSetChanged();UI时无法刷新?

Muh*_*der 0

关键是您正在订单中输入数据,即当您将列表中的一个项目推入列表中时,它会一直向下,您没有在第 4、5 个任何随机索引处输入它,因此您不必调用notifyDataSetChanged()它定义本身说:某些数据已更改或任何反映数据集的视图应刷新自身以使新数据在列表中可见,因为在这种情况下数据超出了可见列表的范围,即子级的数量显示在列表中,因此它(ListView)总是在 listView 中最后显示的特定索引值(项目)之后调用下一个视图。

希望我对你说得清楚一点......!

++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++ 编辑问题后回答,经过搜索并在这方面有我自己的想法和理解:

在第一种情况下,不需要对VIEW进行任何更改..对吗?如果这一点你很清楚,那么就来看第二点。首先,您从数据库中获取数据,然后在列表中添加一个项目,然后在设置适配器后填充它。!!直到整个方法执行并完成列表后才设置适配器..!好的。

但是在第二个场景中,您正在更改视图(几乎所有内容都是android中的视图),因此您通过在已经填充的视图(已经有一个已设置的适配器)上添加另一个项目来操作视图,所以这次您需要告诉视图,嘿,我已经在您中添加了一个项目,现在刷新自己,然后更新列表(即显示)。