리스트뷰 스크롤 끝나면 이미지 보여주기
scroll state 변할 때 getView() 호출하기
Overview
구성은 이렇다.- Adapter 에서 할 일
- Adapter 에서 scrolling 인지를 저장하는 변수 flag 를 하나 만들어 둔다.
- flag 에 따라 원하는 동작을 하도록 getView() 수정
- onScrollStateChanged() 에서 할 일
- adapter 의 flag 에 scrolling 중일 때 표시
- 스크롤이 멈췄을때(IDLE) adapter 의 notifyDataSetChanged() 호출
Details
일단 작성한 코드는 아래와 같다.ListView.java
lview.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { currentChartAdapter.mIsScrolling = (scrollState != SCROLL_STATE_IDLE); Log.d("namh", "scrollStateChanged = " + scrollState); int first = lview.getFirstVisiblePosition(); int count = lview.getChildCount(); // count of listitems showed on the screen // order to draw when the scrolling is stopped. if (scrollState == SCROLL_STATE_IDLE || (first + count > currentChartAdapter.getCount())) { currentChartAdapter.notifyDataSetChanged(); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
Adapter.java
@Override public View getView(int pos, View convertView, ViewGroup parent) { ... if(mIsScrolling == true) { holder.thumb.setImageBitmap(mNoImage); } else{ if(holder.thumb != null) { displayImage(holder.thumb, item.getThumbUrl()); } } ... }
ref. 2 를 에서 이야기 한 것 처럼 notifyDataSetChanged() 를 활용해서 만들었다. ref.3,4 에서 하는 것처럼 ImageView 에 직접 setImageBitmap() 을 해줘도 될 듯 하지만, notifyDataSetChange() 로 하는 것이 훨씬 간결해서 좋다. ^^
예제를 보고 싶어할 수도 있는데, "KaKao Talk 의 채팅 리스트" 를 참고하면 될 듯 하다. 그런 느낌으로 구현이 된다.
확실히 스크롤 속도는 좋지만, 스크롤 동안에 이미지를 보여주지 못하는 것은 user 에 따라 호불호가 갈릴 듯 하다.
Reference
- Android: onScrollStateChanged SCROLL_STATE_IDLE sometimes doesn't fire
- Android - ListView - calling the getView() on demand
- [안드로이드] 천천히 로딩되는 리스트 아이템
- <android-sdk>\samples\android-13\ApiDemos\src\com\example\android\apis\view\List13.java
댓글 없음:
댓글 쓰기