本文參照此文 關于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;
}
}
}