2010년 6월 4일 금요일

Custom ArrayAdapter 사용하기

!) 작성할 클래스 및 리소스들
- item 클래스
- item 을 표시할 row 레이아웃 파일
- row 레이아웃을 저장하기 위한 wrapper 클래스
- ArrayAdapter 를 상속하는 클래스

1. item 클래스 생성


public class Item {
protected String text;
public Item(String text) {
this.text = text;
}
public String getText() {
return text;
}
}


2. item 을 표시할 row 레이아웃 파일 생성
res/layout/row.xml 파일을 생성한다.

간략한 예)

<LinearLayout ...>
<TextView android:id="@android:id/text1" ... />
</LinearLaout>


3. row 레이아웃을 저장하기 위한 wrapper 클래스
간략한 예)

public class ItemWrapper {
View base;
TextView text1;
ItemWrapper(View base) {
this.base = base;
}
public TextView getText1() {
if (text1 == null) {
text1 = (TextView)base.findViewById(android.R.id.text1);
}
return text1;
}
}


4. ArrayAdapter 를 상속하는 클래스 생성

간략한 예)

public class ItemArrayAdapter extends ArrayAdapter {
Context context;ItemArrayAdapter(Context context, List<item> list) {
super(context, R.layout.row, list);
this.context = context;
}
private Item getItem(int position) {
return (Item)((ListActivity)context).getListAdapter().getItem(position);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ItemWrapper wrapper;
if (row == null) {
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(R.layout.row, null);
wrapper = new ItemWrapper(row);
row.setTag(wrapper);
} else {
wrapper = (ItemWrapper)row.getTag();
}
Item item = getItem(position);
wrapper.getText1().setText(item.getText());
}
}


!) 사용하기
ListActivity 나 ListView 를 생성하고 해당 객체에 setListAdapter() 를 사용한다.

간략한 예)

List<Item> list;
new ItemArrayAdapter(this, list);


!) 팁
#
증상: row 레이아웃에 button 과 같이 focusable 한 객체가 있으면 touch 가 동작하지 않는 문제가 있다.
해결: 해당 객체의 focusable 속성을 false 로 설정한다. (ImageButton의 경우 자바코드로 focusable 을 false 로 설정해야만 했다.)

#
List 내용 갱신시에는 ArrayAdapter 클래스에 포함된 notifyDataSetChanged() 함수를 이용한다.
- ArrayAdapter 에 등록한 list 의 내용을 다시 그려준다.
- 갱신할 때마다 setListAdapter 를 이용할 필요가 없다.
- 아래 팁은 안좋은 예

#
List 갱신시 focus 를 전에 선택한 아이템으로 설정하기
- 아이템 얻기: ListActivity 나 ListView 클래스의 getItem 함수를 사용하여 Item 을 얻을 수 있다.
- focus 된 아이템 줄번호 얻기: ListActivity 나 ListView 클래스의 getSelectedItemPosition 함수를 사용하면 현재 focus 된 아이템 줄번호를 얻을 수 있다. (focus 된 아이템 없으면 -1을 리턴한다.)

1. focus 된 아이템을 얻고 나서 해당 아이템을 구분지을 만한 unique 값을 저장한다.
2. setListAdapter() 함수를 사용하여 list 적용한 후 저장해 놓은 unique 값을 비교하여 해당 아이템의 줄번호를 얻는다.
3. ListActivity 나 ListView 클래서의 setSelection 함수를 사용하여 해당 줄번호의 아이템을 focus 한다.

댓글 없음:

댓글 쓰기