天天看點

關于ListView中notifyDataSetChanged()重新整理資料不更新原因

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

        }
    }
           

繼續閱讀