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

时间:2016-01-16 12:04:43

标签: 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();
        }
    }
    }
}

但如果我添加这样的内容,我必须致电notifyDataSetChanged()

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

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

3 个答案:

答案 0 :(得分:1)

该方法在Android框架内部调用。您无需明确调用它。

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

答案 1 :(得分:0)

除了Lily的回答,如果您编写自己的适配器,则必须明确调用它。

答案 2 :(得分:0)

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

希望我对你有点清楚......!

+++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++ 在您编辑问题后,在搜索并在此问题上有自己的想法和理解之后回答:

在第一种情况下, VIEW 没有必要进行任何更改..对。 如果你明白这一点,那就来第二个。首先,您从数据库中获取数据,然后在列表中添加一个项目,然后在设置适配器后填充它。直到整个方法执行并完成List ...时才设置适配器。行。

但是在第二个场景中你正在改变VIEW(几乎所有东西都是在android中查看)所以你通过在已经填充的View上添加另一个项目来操纵一个视图(已经有一个集合-ted adapter),所以这次你需要告诉视图嘿,我已经添加了一个项目现在刷新自己然后更新列表(即显示)。