回答:
以下のために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
ます。
誰かがこれが便利だと思ってください!