回答:
以下のためにArrayAdapter、notifyDataSetChangedあなたが使用している場合のみ動作しadd()、insert()、remove()、およびclear()アダプタ上。
ときArrayAdapterに構築され、それがための参照を保持Listして渡されたことを。あなたが合格した場合Listの活動のメンバーだったこと、そしてその活動の一員後に、変更ArrayAdapterまだ元への参照を保持していますList。アダプタはList、アクティビティでの変更を認識していません。
選択肢は次のとおりです。
ArrayAdapter基本的なリストを修正するために(add()、insert()、remove()、clear()、など)ArrayAdapter新しいListデータでを再作成します。(多くのリソースとガベージコレクションを使用します。)BaseAdapterし、ListAdapterその根底にあるの変更ができますListデータ構造。notifyDataSetChanged()リストが更新されるたびに使用します。UIスレッドで呼び出すには、runOnUiThread()ofを使用しActivityます。その後、notifyDataSetChanged()動作します。notifyDataSetChanged()、このように呼ぶとどうなり((BaseAdapter) arrayAdapter).notifyDataSetChanged();ますか?
このrunOnUiThread()方法は次のように使用できます。を使用していない場合はListActivity、コードを調整してへの参照を取得しますArrayAdapter。
final ArrayAdapter adapter = ((ArrayAdapter)getListAdapter());
runOnUiThread(new Runnable() {
public void run() {
adapter.notifyDataSetChanged();
}
});
私は最近このトピックについて書きましたが、この投稿は古いものですが、BaseAdapter.notifyDataSetChanged()ステップバイステップで正しい方法で実装する方法を知りたい人に役立つと思いました。
AndroidにBaseAdapter.notifyDataSetChanged()を正しく実装する方法または新しいブログBaseAdapter.notifyDataSetChanged()に従ってください。
mItem.add()1つの要素をmItem.get(position).setImage(encodedImage)編集しましたが、そのためにエラーNullPointer exeptionが発生している可能性があります。 add()、clear()、remove()などの場合のみ
同じ問題があり、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);
}
}
}
super.addAll(..)API> 11およびsuper.add(.. )あなたのような反復との組み合わせで:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { super.addAll(items); } else { for (Object o : collection) { super.add(o); } }。ここで、新しいアダプタクラスを拡張します。
私はこれが遅い対応であることを知っていますが、私は同様の問題に直面してい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ます。
誰かがこれが便利だと思ってください!