2013-06-15 2 views
0

텍스트가있는 축소판 격자를 표시하는 어댑터가 있습니다. 이 썸네일은로드하기에 무겁고 그리기가 무겁습니다.어댑터 업데이트를위한 최선의 방법

썸네일 그리드 뷰는 2 초마다 1 개의 새 항목으로 새로운 내용으로 꾸며집니다.

내 어댑터가 새 항목을 삽입하기 위해 나는 외부에서 호출하는 기능을 가지고 :

내가있는 gridview에 새로운 요소를 삽입 할 때, 내 현재의 접근 방식이며, 어떻게됩니까
public void postNew(Item i) { 
    arrayStuff.put(i); 
    notifyDataSetChanged(); 
} 

, 그것은 심지어 모든 것을 새로 고침 추가 된 항목이 보이지 않을 경우. 새로 고침 프로세스 종류는 사용자가 특히 gridview를 탐색하고 새 콘텐츠가 도착할 경우 경험을 깰 수 있습니다.

어떻게 개선 하시겠습니까? 가벼운 'notifyDataSetChanged()'또는 이와 비슷한 것이 있습니까?

답변

1

알림 데이터 세트의 더 가벼운 버전을 모르지만 ListView.getFirstVisiblePosition 및 ListView.getLastVisiblePosition을 사용하여 최근에 추가 된 위치가 표시되는지 여부를 확인하고 가능한 경우 notifyDataSetChanged 만 호출 할 수 있습니다.

"무거운"비트 맵의 ​​경우 무거운만큼 재 샘플화하거나 LarCache를 사용하여 필요한 최소 크기로 확장해야한다고 생각합니다. 변경된 알림 데이터 세트를 다시 그리는 필요성을 줄일 수 있습니다.

+0

흥미 롭습니다. getLastVisiblePosition rupps

+1

오, 내 실수로, 목록보기에 항목 추가에 대해 알게하려면 notifydatasetchanged가 필요합니다. 한 가지 할 수있는 것은 getview가 마지막 위치를 호출 할 때마다 arrayStuff.getSize == listSize에 대한 점검을 수행하는 것입니다. 일치하지 않으면 notifydatasetchanged를 수행 할 수 있습니다. –

+0

멋진 트릭을 보인다. 배경 새로 고침이 필요합니다. 왜냐하면 목록에 3000 개의 항목이 있고 새 항목이 추가되고 사용자가 처음 25 개를 표시하는 경우가 종종 있기 때문입니다. 여기서는 다시 그리기가 필요하지 않습니다! 기본 위젯 (TwoWayGridView)의 소스 코드를 탐색하고 있는데 무엇을 그리는 최적화와 관련하여 DataSetChanged()에서 많은 일을하는 것을 볼 수 있습니다. 그리고 이러한 최적화를 위해 내 데이터를 반복적으로 무시합니다. – rupps

1

캐싱의 일부 형식을 구현해야하는 것처럼 들리지만 메모리에로드되지 않은 이미지가있는 것은 좋지 않은데, 이상적으로 캐시가 될 때) 표시.

다른 방법으로는 새 콘텐츠가 도착할 때 시각적 표시기를 추가 한 다음 "새로 고침하기"또는 유사한 방법으로 구현 한 다음 어댑터에서 notifyDataSetChanged()를 호출하여 콘텐츠를 새로 고치는 것일 수 있습니다. 스크린 컨텐츠가 끊임없이 변화하는 경우 따르기가 어려울 것이므로 매 초마다 새로 고치는 것이 훌륭한 UX를 제공하지 않는다고 상상해보십시오.

+0

당신의 제안에 감사드립니다 ... 사실, 나는 이미 캐싱을 가지고 있지만, 메모리에 있지 않습니다. 네트워크의 이미지를 sdcard에 캐시합니다. 나는 메모리에서 LRU를 아직 사용하지 않았다. 나는 그것을 피하려고 노력하고있다. 어댑터를 다시 칠하는 것을 피하고 훨씬 많은 메모리를 절약 할 수 있다면 sdcard 체계가 충분히 빠르다. :) – rupps

0

여러 이미지 뷰 및 적절한 텍스트 뷰를 추가하는 사용자 정의 뷰 (런타임시 동적)를 작성해야하며 컨테이너 뷰는 LinearLayout이어야하며, 특정 뷰 또는 요소를 업데이트 할 수 있어야합니다.

관련 문제