Thread内でListViewを更新するには

ListAdapterへアイテムを追加したとき、またはnotifyDataSetChangedを呼び出したときにに次のようなエラーがコンソールに表示されることがあります。

`java.lang.IllegalStateException:` The content of the adapter has changed but 
ListView  did not receive a notification. Make sure the content of your adapter 
is not modified from a background thread, but only from the UI thread.

このエラーメッセージにはアダプターの中身が変わったにも関わらずリストビューがその変化を受け取れていないということが書かれているみたいです。

このエラーが表示される原因と対処法をここでは簡単にまとめてみたいと思います。

原因と対処法

ListViewのアイテムが多い場合などにThreadを使ってListViewを更新したい場合、次のようにするとエラーが出ることがあります。

new Thread(new Runnable()
{
    @Override
    public void run() 
    {
        /** アイテムの追加・更新... */
        
        listAdapter.notifyDataSetChanged();
            /// アダプターを更新
    }
}).start();

こうした場合、UIスレッド以外からアダプターを更新しているためにエラーが起こるようです。

なので、アダプターの更新だけActivityrunOnUiThreadメソッド内で行えば解決します。

new Thread(new Runnable()
{
    @Override
    public void run() 
    {
        /** アイテムの追加・更新... */
        
        /** UIスレッド内でListViewを更新 */
        runOnUiThread(new Runnable()
        {
            @Override
            public void run() 
            {
                listAdapter.notifyDataSetChanged();
                    ///アダプター更新
            }
        });
    }
}).start();

ちなみにHandlerを使った場合は同じエラーが出てしまうのでListViewの更新に限ってはrunOnUiThread内で行った方が良いみたいです。

以上、Thread内でListViewを更新する方法でした。では、また!

関連項目
プライバシーポリシー