2012-06-04 2 views
1

arrayadapter에 대한 목록보기가 있습니다. 내 항목 배열을 완전히 채울 때 어댑터 만 새로 고침하고 싶습니다. notifyDataSetChanged()는 add, addAll, remove, insert 또는 clear와 같은 메소드 후에 자동으로 호출된다는 것을 알고 있지만 내 경우에는 버그가있을 수 있습니다. 다음은 간단한 코드 스 니펫입니다. 이 경우 어댑터가 ListView에 알림을 표시해서는 안되며 콘텐츠가 표시되지 않아야합니다 (콘텐츠는 내 장치에 표시됨).android ArrayAdapter.setNotifyOnChange (false)는 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 

이 문제에 대한 의견이 있으십니까?

답변

0

ListView 소스 코드를 보면 이 mDataChanged으로 설정되고 requestLayout으로 전화를 걸면 레이아웃을 예약합니다. 어댑터가 clearaddAll 코드가 실행 된 후 해당 레이아웃이 발생할 때까지 다시 읽지 않습니다.

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

또한, 체크 초점 또는 항목을 선택하는 것과 mDataChanged이 true 새로운 requestLayout 호출로 설정되도록 여러 가지 다른 방법이 있습니다. notifyDataSetChanged를 호출하면 그냥 즉시 발생한다 :

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

public void onChanged() { 
     mDataChanged = true; 
     ... 
     requestLayout(); 
    } 
관련 문제