web-dev-qa-db-ja.com

notifyDataSetChangedの例

私は私のAndroid ApplicationArrayAdapternotifyDataSetChanged()メソッドを使おうとしていますが、うまくいきません。

私は ここで答えとしてnotifyDataSetChanged()がメインスレッドで実行されるべきであることを発見しました、しかしそのための例はありませんでした。

誰かが例または少なくともリンクを送ってもらえますか。

157
Tima

ArrayAdapterの場合、notifyDataSetChangedは、アダプタでadd()insert()remove()、およびclear()を使用する場合にのみ機能します。

ArrayAdapterが作成されると、渡されたListの参照が保持されます。ActivityのメンバーであるListを渡し、後でそのActivityメンバーを変更する場合、ArrayAdapterはまだ元のList。アダプタは、アクティビティのListを変更したことを認識しません。

あなたの選択は:

  1. ArrayAdapterの関数を使用して、基礎となるリストを変更します(add()insert()remove()clear()など)。
  2. 新しいArrayAdapterデータを使用してListを再作成します。 (多くのリソースとガベージコレクションを使用します。)
  3. 基礎となるBaseAdapterデータ構造の変更を可能にするListAdapterおよびListから派生した独自のクラスを作成します。
  4. リストが更新されるたびにnotifyDataSetChanged()を使用してください。 UIスレッドでそれを呼び出すには、ActivityrunOnUiThread()を使用します。その後、notifyDataSetChanged()が機能します。
316
jnosek

次のように runOnUiThread() メソッドを使うことができます。 ListActivityを使用していない場合は、コードを修正してArrayAdapterへの参照を取得してください。

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
30
Brian

私は最近このトピックについて書いていますが、この記事は古くなっていますが、BaseAdapter.notifyDataSetChanged()を段階的に正しい方法で実装する方法を知りたい人には役に立つと思いました。

AndroidにBaseAdapter.notifyDataSetChanged()を正しく実装する方法 または 新しいブログBaseAdapter.notifyDataSetChanged() に従ってください。

11
Arif Nadeem

私は同じ問題を抱えていたので、継続的にArrayAdapter全体を新しいインスタンスに置き換えないことを望みます。したがって、私はAdapterHelperに他の場所で重い作業をさせます。

通常notifyを呼び出す(しようとする)ところにこれを追加してください

new AdapterHelper().update((ArrayAdapter)adapter, new ArrayList<Object>(yourArrayList));
adapter.notifyDataSetChanged();

AdapterHelperクラス

public class AdapterHelper {
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public void update(ArrayAdapter arrayAdapter, ArrayList<Object> listOfObject){
        arrayAdapter.clear();
        for (Object object : listOfObject){
            arrayAdapter.add(object);
        }
    }
}
6
Kevin Parker

私はこれが遅い対応であることを知っています、しかし私は同様の問題に直面していました、そして私はnotifyDataSetChanged()を適切な場所に使用することによってそれを解決することができました。

だから私の状況は以下の通りでした。

アクションバーのタブ(フラグメント)のリストビューを、まったく異なるアクティビティから返されたコンテンツで更新する必要がありました。ただし、当初はリストビューには変更が反映されていませんでした。しかし、別のタブをクリックして目的のタブに戻ったときには、リストビューは他のアクティビティの正しいコンテンツで更新されていました。そこでこれを解決するために、データを返さなければならないアクティビティのコードでアクションバーアダプタのnotifyDataSetChanged()を使いました。

これは私がアクティビティで使用したコードスニペットです。

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) 
    {
        case R.id.action_new_forward:

            FragmentTab2.mListAdapter.notifyDataSetChanged();//this updates the adapter in my action bar tab
            Intent ina = new Intent(getApplicationContext(), MainActivity.class);
            ina.putExtra("stra", values1);
            startActivity(ina);// This is the code to start the parent activity of my action bar tab(fragment).
    }
}

このアクティビティはいくつかのデータをFragmentTab2に返し、それはFragmentTab2内の私のリストビューを直接更新します。

誰かがこれが役に立つことを願っています!

2
mutp