1

arrayadapter を使用したリストビューがあります。アイテムの配列を完全に埋めるときに、この時点でのみアダプターを更新したいと思います。add、addAll、remove、insert、clear などのメソッドの後に notifyDataSetChanged() が自動的に呼び出されることはわかっていますが、私の場合はバグがあると思います。動作するコードの簡単なスニペットを次に示します。この場合、アダプターは ListView に通知してはならず、コンテンツは表示されません (ただし、コンテンツはデバイスに表示されます)。

ArrayList<MenuFragmentItem> menu = buildMenu();
MenuAdapter mAdapter = new MenuAdapter(getActivity().getApplicationContext(), 0, MenuFragment.this);
mListView.setAdapter(mAdapter);
mAdapter.setNotifyOnChange(false);
mAdapter.clear();
mAdapter.addAll(menu);
//      mAdapter.notifyDataSetChanged(); SAME RESULT IF I REMOVE THIS LINE, CONTENT IS DISPLAYED

この問題について何か考えはありますか?

4

1 に答える 1

0

ListViewソース コードを見ると、レイアウトをスケジュールするsetAdaptersetmDataChangedと callsが表示されます。コードが実行された後、requestLayoutそのレイアウトが発生するまで、アダプターは読み戻されません。clearaddAll

http://gitorious.org/android-eeepc/base/blobs/3661101005c6527dfd384d0c88c4a3b68ee208af/core/java/android/widget/ListView.java

項目のチェック、フォーカス、または選択など、mDataChangedtrue に設定して新しい呼び出しを発生させる方法は他にもいくつかあります。requestLayout呼び出すnotifyDataSetChangedだけで、すぐにそれが実現します。

http://gitorious.org/android-eeepc/base/blobs/3661101005c6527dfd384d0c88c4a3b68ee208af/core/java/android/widget/AdapterView.java#line772

    public void onChanged() {
        mDataChanged = true;
        ...
        requestLayout();
    }
于 2012-10-16T08:23:26.073 に答える