私は私のAndroid Application
でArrayAdapter
のnotifyDataSetChanged()
メソッドを使おうとしていますが、うまくいきません。
私は ここで答えとして 、notifyDataSetChanged()
がメインスレッドで実行されるべきであることを発見しました、しかしそのための例はありませんでした。
誰かが例または少なくともリンクを送ってもらえますか。
ArrayAdapter
の場合、notifyDataSetChanged
は、アダプタでadd()
、insert()
、remove()
、およびclear()
を使用する場合にのみ機能します。
ArrayAdapter
が作成されると、渡されたList
の参照が保持されます。ActivityのメンバーであるList
を渡し、後でそのActivityメンバーを変更する場合、ArrayAdapter
はまだ元のList
。アダプタは、アクティビティのList
を変更したことを認識しません。
あなたの選択は:
ArrayAdapter
の関数を使用して、基礎となるリストを変更します(add()
、insert()
、remove()
、clear()
など)。ArrayAdapter
データを使用してList
を再作成します。 (多くのリソースとガベージコレクションを使用します。)BaseAdapter
データ構造の変更を可能にするListAdapter
およびList
から派生した独自のクラスを作成します。notifyDataSetChanged()
を使用してください。 UIスレッドでそれを呼び出すには、Activity
のrunOnUiThread()
を使用します。その後、notifyDataSetChanged()
が機能します。次のように runOnUiThread()
メソッドを使うことができます。 ListActivity
を使用していない場合は、コードを修正してArrayAdapter
への参照を取得してください。
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
私は最近このトピックについて書いていますが、この記事は古くなっていますが、BaseAdapter.notifyDataSetChanged()
を段階的に正しい方法で実装する方法を知りたい人には役に立つと思いました。
AndroidにBaseAdapter.notifyDataSetChanged()を正しく実装する方法 または 新しいブログBaseAdapter.notifyDataSetChanged() に従ってください。
私は同じ問題を抱えていたので、継続的に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);
}
}
}
私はこれが遅い対応であることを知っています、しかし私は同様の問題に直面していました、そして私は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
内の私のリストビューを直接更新します。
誰かがこれが役に立つことを願っています!