メソッドで anを使用Android Application
しようとしていますが、うまくいきません。notifyDataSetChanged()
ArrayAdapter
メインスレッドで実行する必要がある回答 hereを見つけましnotifyDataSetChanged()
たが、その例はありませんでした。
誰かが例または少なくともリンクを送ってもらえますか?!
メソッドで anを使用Android Application
しようとしていますが、うまくいきません。notifyDataSetChanged()
ArrayAdapter
メインスレッドで実行する必要がある回答 hereを見つけまし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 スレッドで呼び出すには、runOnUiThread()
of を使用しActivity
ます。その後、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 に別の場所で面倒な作業を行わせます。
これを、通常は通知を呼び出す (しようとする) 場所に追加します。
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
ます。
誰かがこれが役に立つことを願っています!