本文参照此文 关于ListView中notifyDataSetChanged()刷新数据不更新原因,仅作个人学习记录用。
本人在写一个从sqlite数据库里面获取数据的例子,但是发现获取到的list并不能被 myMarkAdapter.notifyDataSetChanged(); 更新; 以下是具体代码。其中的cards即为数据源。 总之一句话,不能让adapter认为你使用了一个全新的数据源,这样它识别不出来;要在原来的基础上clear(),再addall();这样它就认为还是原来的数据源。
private MyMarkAdapter myMarkAdapter = null;
private List<Card>cards = new ArrayList<>();
private Button btnEvents;
private Button btnDonation;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mymark);
//初始化DBManager
mgr = new DBManager(this);
cards = mgr.queryMyMark("1");
tvSum = (TextView)findViewById(R.id.tv_sum);
listView = (ListView)findViewById(R.id.listView);
btnEvents = (Button)findViewById(R.id.btn_events_mymark);
btnDonation = (Button)findViewById(R.id.btn_donation_mymark);
tvSum.setText("" +cards.size()/* + "概览:" +cards.get(0).getContent()*/);
myMarkAdapter = new MyMarkAdapter(cards,MyMark.this);
listView.setAdapter(myMarkAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
((MyApplication)MyMark.this.getApplication()).setIntentObject(cards.get(position));
startActivity(new Intent(MyMark.this,DetailsActivity.class));
}
});
Listener listener = new Listener();
btnEvents.setOnClickListener(listener);
btnDonation.setOnClickListener(listener);
}
private class Listener implements View.OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_events_mymark:
<span style="background-color: rgb(255, 0, 0);"> //错误
cards.clear();
cards = mgr.queryMyMark("1");</span>
myMarkAdapter.notifyDataSetChanged();
// listView.setAdapter(new MyMarkAdapter(cards,MyMark.this));
tvSum.setText("" +cards.size()/* + "概览:" +cards.get(0).getContent()*/);
break;
case R.id.btn_donation_mymark:
<span style="background-color: rgb(51, 255, 51);"> //正确
cards.clear();
cards.addAll(mgr.queryMyMark("2"));</span>
myMarkAdapter.notifyDataSetChanged();
// listView.setAdapter(new MyMarkAdapter(cards, MyMark.this));
tvSum.setText("" +cards.size()/* + "概览:" +cards.get(0).getContent()*/);
break;
default:
break;
}
}
}