読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

notifyDataSetChanged()でListViewが更新されない

Android

小ネタですね。ArrayAdapterを使っている場合に起こる。

その原因はこれ。

ja.stackoverflow.com

ArrayAdapterは、Class Referenceにあるように一度保持したリストに対して、add()、clear()、remove()などのメソッドで操作するアダプタクラスになります。

更新したい場合はコンストラクタで入れ込んリストを代入するだけじゃダメで、clear()してaddしないとArrayAdapterに対してリストのアイテムの更新が伝搬されないって話。

        //アダプタ登録
        List<String> data_list = new ArrayList<String>();
        //MyArrayAdapterはArrayAdapeterのサブクラス
        MyArrayAdapter adapter = new MyArrayAdapter(
                                       this.getActivity(), 0, data_list);
        ListView listView = (ListView)view.findViewById(R.id.testListView);
        listView.setAdapter(adapter);

       //これではダメ
       //ArrayAdapter内でPrivateなプロパティで持ってるため、伝搬されない
       data_list = updateBySomeReason();
       adapter.notifyDataSetChanged()
    
       //これで更新される
      adapter.clear();
      adapter.addAll(updateBySomeReason);
      adapter.notifyDataSetChanged()