2014-06-09 5 views
0

내 질문은이 게시물을 기반으로합니다. 두 번째 방법은 성능에게 위의 질문에 대한 답이 있다고Android ListView - adapter.notifyDataSetChanged와 새 어댑터 사용의 차이점

너무 비용이 많이 들고 영향을주기 때문에 당신이 notifyDataSetChanged()하지 listView.setAdapter(new Adapter(....));를 호출해야합니다 목록보기를 새로 고치 나는 다양한 기사를 읽은

Android. How does notifyDataSetChanged() method and ListViews work?

adapter.notifyDataSetChanged()은 현재 화면에 표시되는보기에 영향을줍니다. 따라서 getView()은 현재 표시된 항목의 수만큼 호출됩니다.

그러나 새 어댑터를 listView에도 할당 할 때 getView()은 동일한 횟수만큼 호출됩니다.

adapter.notifyDataSetChanged()listView.setAdapter(new Adapter(....));의 차이점은 무엇입니까?

답변

2

notifyDataSetChanged()으로 전화하면 getView() 번을 같은 횟수로 부릅니다. 그러나 어댑터가 동일하므로이보기를 다시 사용할 수 있습니다 (예 : convertView 전달).

ListView은 새 어댑터가 동일한 레이아웃을 사용하는지 확실히 알 수 없으므로 새 어댑터를 제공 할 때이를 수행 할 수 없습니다. 따라서 리사이클 러가 지워지고 모든 행이 처음부터 새로 만들어 져야합니다 (다시 사용하는 것보다 훨씬 비쌉니다).

(-하지만 어쨌든 나쁜 아이디어는 새로운 뷰를 생성/팽창 항상 convertView를 제공하고 무시한다면이 성능 점은 이론에 불과).

+0

또 다른 중요한 차이점은 스크롤 위치를 유지하기 위해 안정적인 ID를 사용할 수있는 능력을 잃게된다는 것입니다. ListView는 새 어댑터의 안정 ID가 이전 어댑터와 동일하고 귀하의 사용자를 목록의 맨 위로 되돌려 보낼 것입니다. – sddamico

+0

그래서 (꼭대기에서 스크롤을 제외하고) 뷰를 재사용하기 위해 getView() 메소드에서 ViewHolder를 사용할 때만 차이가 있습니까? – Anonymous

+0

차이점은 실제로 제공된 'convertView'를 사용했는지 여부입니다 (즉, 항상 값을 무시하고 새보기를 작성/부 풀림). ViewHolder 패턴은 이에 대한 추가 최적화입니다. 이 지점을 포함하도록 수정 된 답변. – matiash

0

setAdapter()는 convertView로 저장하는 데 사용되는 스크랩 힙을 지우고 새 어댑터를 설정 한 다음 requestLayout()을 호출합니다.

그러나 notifyDataSetChanged()는 requestLayout()이므로 스크랩 힙이 여전히 존재하며 getView()가 발생하면 스크랩 힙에 getView가 포함될 경우 convertView가 null이 아니므로 확장 될 필요가 없습니다.

따라서 데이터가 변경되면 notifyDataSetChanged()를 호출하는 것이 더 효율적이지만 setAdapter()는 호출하지 않는 것이 효율적입니다.