public class MainActivity extends Activity {
Button change;
ListView contactsView;
ArrayAdapter<String> adapter;
List<String> contactList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
change=(Button) findViewById(R.id.change);
contactsView = (ListView) findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, contactList);
contactsView.setAdapter(adapter);
change.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
readContacts();
}
@Override
protected void onResume() {
super.onResume();
}
private void readContacts() {
contactList.add("ddd");
contactList.add("ooo");
}
}如代码:很简单,readContacts函数就是给contactList中添加数据的,但是这个函数是在setadapter之后调用的,为什么listview中还是可以显示出来?(同样,把readContacts函数放在onResume中,也是可以显示出来)
但是,如果另写一个button,在button的点击事件里调用readContacts方法,则listview就不会显示出来了。
这是为什么?
------解决思路----------------------
我用debug走了一遍,我认为这个当读到setAdapter时候,适配器加载到了内存,并没有立即执行,然后读到了 readContacts();集合中添加到了数据,但是此时debug显示集合中并没有数据,所以我认为是暂时加载到内存中,当读到 } 的时候,集合中加载到了内存中的数据,此时集合中才真正有了数据,所以onCreate中语句执行时,是把数据暂时加载到内存,当结束此方法时,才从内存中加载数据执行方法
------解决思路----------------------
一般而言,在修改listview的数据之后,要调用adapter.notifyDataChange 才会刷新。如果只是修改list的数据,不通知adapter数据改变,是可能会触发exception的。你这个之所以没有问题,可能是因为在onCreate或者onResume的时候,listview还没有真正的去使用里面的数据。如果你放到onClick里面,然后等onClick被调用,数据修改之后再去滑动listview,应该会crash的。