안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
이번 포스팅에서는 리스트 뷰 뷰홀더 ListView ViewHolder 패턴의 사용 이유와 사용방법에 대해 알아보겠습니다.
뷰홀더(ViewHolder)는 리스트 뷰의 유연한 동작을 위해서 나왔습니다.
예를 들어보면 리스트가 10000개가 있다고 할 때
한 리스트에 TextView가 2개씩 있다고 하면
TextView 생성을 위해 매번 findViewById()를 호출해야하고
10000번 호출된다고 하면 엄청난 오버해드를 불러오고 스크롤을 내릴 때마다
반응 속도가 느려지겠죠?
이런 오버 해드와 느린 반응 속도의 해결을 위해
뷰홀더(ViewHolder) 가 나오게 되었습니다.
뷰홀더 패턴의 원리 >>
각 View 객체를 ViewHolder에 고정시키는 건데요.
이런 방법이 리스트 뷰의 성능 개선에 도움을 준다고 하네요~~
사용 벙법 >>
먼저 뷰홀더 클래스를 생성해야 하는데요.
어댑터 클래스에 내부 클래스로 작성해도 되고
별도의 클래스로 작성해도 됩니다.
어댑터 클래스 예제
public class SampleAdapter extends BaseAdapter { private Vector<User> user; // 넣고자 하는 아이템의 값들 private LayoutInflater layoutInflater; public SampleAdapter(Context context, Vector<User> user, LayoutInflater layoutInflater) { this.user = user; this.layoutInflater = layoutInflater; } // ViewHolder private class ViewHolder { private TextView textView; private TextView msgCountTextView; } @Override public int getCount() { return user.size(); } @Override public Object getItem(int i) { return user.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int position, View convertView, ViewGroup parent) { //ViewHolder 사용 방법 ViewHolder viewHolder; if (convertView == null) { convertView = layoutInflater.inflate(R.layout.employee_row, null); viewHolder = new ViewHolder(); viewHolder.textView = (TextView) convertView.findViewById(R.id.employeeId); viewHolder.msgCountTextView = (TextView) convertView.findViewById(R.id.msgCountTextView); convertView.setTa g(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String subject = user.get(position).getName(); viewHolder.textView.setText(subject); int count = user.get(position).getCount(); if (count == 0) { viewHolder.msgCountTextView.setText(""); viewHolder.msgCountTextView.setBackgroundResource(0); } else { viewHolder.msgCountTextView.setText(String.valueOf(count)); viewHolder.msgCountTextView.setBackgroundResource(R.drawable.chat_count); } return convertView; } } |
// 위 코드에서 주의하실 점은
if(convertView == null) {
} else {
}
문 이후에
각 View들에 값을 대입해야 순서가 뒤죽박죽 되지않고
제대로 동작합니다.
저도 처음 사용할 때
if(convertView == null) {}
안에 View에 값들어 저장했다가
순서가 제대로 뒤죽박죽이 되는 것을 경험했습니다.
꼭 주의하세요 ~
그 외의 리스트 아이템을 적용시킨 다거나 하는 부분, Acitivty에서 setAdapter 하는 부분은
기존 리스트 뷰 사용법과 같습니다~~
이상입니다.
위 예제의 결과는 아니고 제가 따로 뷰홀더 패턴을 사용해 리스트 뷰를 만들어 보았는데요.
그 결과 입니다 ㅎㅎ
'안드로이드' 카테고리의 다른 글
안드로이드 Notification Activity 중복실행 방지 노티피케이션 액티비티 중복 실행 방지 (2) | 2017.03.25 |
---|---|
안드로이드 앱, 안드로이드 프로젝트에 firebase 추가하는 방법 (0) | 2017.03.19 |
안드로이드 플로팅 액션 버튼 스피드 다이얼 floating action button speed dial 만들기 (0) | 2017.03.17 |
안드로이드 확장 리스트뷰 ExpandableListView 사용법 - 중첩 리스트 뷰 (6) | 2017.03.17 |
안드로이드 ListView 리스트뷰 item 아이템 터치가 안될 때, setOnItemClickListener가 안먹힐 때 (0) | 2017.03.16 |