예전에 구글에서 제공한 어떤 소스에 공개되어있는것을 뜯어내어서 나름대로 수정해서 사용하기 편하게 만든 버젼입니다.
ListView 사용할때처럼 adapter 만 붙혀주면 간단하게 구현할수 있습니다.


 
by cranix 2012. 3. 26. 15:10
안드로이드에서 가장 많이 사용하는 View 는 ListView 일 것으로 생각됩니다.(적어도 저는...)
이 리스트뷰는 기본적으로 리스트형의 많은양의 데이터를 표시하기위해 존재합니다.
그래서 프로그래밍 하는 스타일에 따라 체감속도에 영향을 많이 줍니다.

안드로이드에서는 이러한 데이터의 효율적인 처리를 위해서 이미 사용되어진 view 를 재활용 할 수 있도록 해 주고 있습니다.
이번 포스트에서는 그 재활용 하는 방법에 대해서 알아보도록 하겠습니다.


안드로이드는 ListView 에 데이터를 채울때 Adapter 를 이용합니다.
이 Adapter 를 생성할때 가장 중요한메소드는 getView() 입니다.
아래와 같은 기본형을 가집니다.
View getView(int position, View convertView, ViewGroup parent)

이 메소드의 파라메터중 convertView 가 재활용과 관련된 파라메터 입니다.
이 convertView 파라메터에서는 재사용할 view 가 없다면 null 을 넘겨주고 있다면 해당 view 를 넘겨줍니다.

이를 이용하여 Holder 패턴을 구현하는데 대부분 아래와 같이 사용합니다.
 public class ItemHolder {
  public TextView textView = null;
 }

 public View getView(int position, View convertView, ViewGroup parent) {
  ItemHolder holder = null;
  if (convertView == null || convertView.getId() != R.layout.list_item) {
// 재사용할 view 가 없거나 재사용할 view 가 다른 layout 으로 작성되어졌을경우 xml 새로 파싱합니다.
// convertView 에는 여기서 inflate 한 view 만 넘어오는것이 아닙니다.
// 예를들어 이 listview 에 headerView 가 있다면 headerView 역시 convertView 에 넘어오게 됩니다. 
// 이럴경우 원하지 않은 결과가(거의 크래쉬) 나오기때문에 반드시 layout 이 맞는지를 비교해 줘야합니다.


   convertView = inflater.inflate(R.layout.list_item, null);
   holder = new ItemHolder();
   holder.textView = (TextView) convertView.findViewById(R.id.textView1);
// 파싱된 결과를 holder 에 담아서 tag 로 저장해둡니다.
   convertView.setTag(holder);
   convertView.setId(R.layout.list_item);
  }
  else {
// 재사용할 view 가 있을경우 해당 view 의 tag 를 가져와서 ItemHolder 로 캐스팅하여 사용합니다.
   holder = (ItemHolder) convertView.getTag();
  }

// 여기부터는 얻어온 holder 를 이용하여 데이터를 채웁니다.
  holder.textView.setText(getItem(position).toString());
  
  return convertView;
 }

이런 형태를 취하는 이유는 안드로이드에서 시간이 가장 오래걸리는 작업중의 하나가 findViewById 메소드를 이용한 xml 파싱작업 이기 때문에 해당 메소드의 호출을 최소화 하기 위함입니다.




by cranix 2011. 6. 27. 18:17
| 1 |