175

メソッドで anを使用Android Applicationしようとしていますが、うまくいきません。notifyDataSetChanged()ArrayAdapter

メインスレッドで実行する必要がある回答 hereを見つけましnotifyDataSetChanged()たが、その例はありませんでした。

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

4

5 に答える 5

334

の場合、アダプタで 、、、およびを使用する場合ArrayAdapterにのみ機能します。notifyDataSetChangedadd()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 スレッドで呼び出すには、runOnUiThread()of を使用しActivityます。その後、notifyDataSetChanged()動作します。
于 2011-02-23T14:49:19.700 に答える
35

この方法は次のように使用できrunOnUiThread()ます。を使用していない場合はListActivity、コードを調整して への参照を取得してくださいArrayAdapter

final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
于 2010-09-08T15:50:16.050 に答える
12

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

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

于 2013-02-15T10:24:14.963 に答える
7

私は同じ問題を抱えていましたが、ArrayAdapter 全体を継続的に新しいインスタンスに置き換えたくないのです。したがって、私は AdapterHelper に別の場所で面倒な作業を行わせます。

これを、通常は通知を呼び出す (しようとする) 場所に追加します。

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);
        }
    }
}
于 2011-12-13T20:41:43.517 に答える
3

これは遅い応答であることは知っていますが、同様の問題に直面していたので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ます。

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

于 2014-09-18T17:57:25.943 に答える