티스토리 뷰
Android Expandable 예제에 이어서 Expandable Custom 예제를 작성해보았습니다. 지난번과는 다른 데이터를 사용하였고, 결과화면의 차이는 없습니다. 첫 번째에 올렸던 기본예제는 아래 링크를 통해 확인 가능합니다.
Custom 하기
이번 예제는 제목 그대로 Custom을 하였습니다. Expandable을 커스텀하기 위한 방법은 간단합니다.
BaseExpandableListAdapter를 상속받아서 커스텀하면 됩니다.
BaseExpandableListAdapter API 페이지
http://developer.android.com/reference/android/widget/BaseExpandableListAdapter.html
ExpandableListAdapter API 페이지
http://developer.android.com/reference/android/widget/ExpandableListAdapter.html
BaseExpandableListAdapter Public Mehtod
BaseExpandableListAdapter은 ListView와는 다르게 Child와 Group 2가지로 구분이 됩니다. 그렇기 때문에 2가지의 다른 메소드가 아래와 같이 정의 되어 있습니다. 그렇기에 아래 메소드 중 화면에 표시하는 관련 Method는 모두 작성해주셔야 합니다. 사용해야 할 Method는 별도로 체크하겠습니다.
- 기본적으로 구현해야 하는 내용을 구현여부에 V 했습니다.
구현여부 | Type | Method Name |
abstract boolean |
areAllItemsEnabled() |
|
V | abstract Object |
getChild(int groupPosition, int childPosition) |
V | abstract long | getChildId(int groupPosition, int childPosition) |
V | abstract View | getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) |
V | abstract int | getChildrenCount(int groupPosition) |
abstract long | getCombinedChildId(long groupId, long childId) | |
abstract long | getCombinedGroupId(long groupId) 특정 Group의 아이디 값을 가져옵니다. | |
V | abstract Object | getGroup(int groupPosition) |
V | abstract int | getGroupCount() Group의 Count를 Return 합니다. |
V | abstract long | getGroupId(int groupPosition) |
V | abstract View | getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) |
V | abstract boolean | hasStableIds() |
V | abstract boolean | isChildSelectable(int groupPosition, int childPosition) |
abstract boolean | isEmpty() | |
abstract void | onGroupCollapsed(int groupPosition) | |
abstract void | onGroupExpanded(int groupPosition) Group이 확장될 경우 호출합니다. | |
abstract void | registerDataSetObserver(DataSetObserver observer) | |
abstract void | unregisterDataSetObserver(DataSetObserver observer) |
V 표시가된 Method들이 기본적으로 구현되어야 하며, 나머지는 선택적으로 구현하시면 됩니다.
구현 내용
구현내용은 BaseExpandableAdapter를 상속받아서 구현하였습니다. API를 보시면 아시겠지만 BaseExpandableAdapter를 상속을 받지만 실제로는 ExpandableAdapter에서 해당 Method의 내용을 볼 수 있습니다.
저는 간단하게 휴대폰 OS 별로 휴대폰의 종류를 작성해보는 Custom ExpandableListView를 작성해보았습니다. 그리고 이미지 View를 사용했는데 기본 아이콘을 화면에 표시하였습니다.
주요 소스코드
MainActivity.java - 메인 엑티비티
ExpandableListView list = (ExpandableListView)findViewById(R.id.list); //create Data list.setAdapter(new ExpandableAdapter(this, createData()));
phoneData.java - 제가 사용하기 위해 구현한 Data 클래스
public class phoneData { String OS; ArrayList<String> PhoneType; public phoneData(String os, ArrayList<String> phoneType) { OS = os; PhoneType = phoneType; } }
ExpandableAdapter.java - BaseExpandableAdatper를 상속받아 구현한 클래스
public class ExpandableAdapter extends BaseExpandableListAdapter { Context mContext; ArrayList<phoneData> mPhoneData; public ExpandableAdapter(Context context, ArrayList<phoneData> phone) { mContext = context; mPhoneData = phone; } @Override public Object getChild(int groupPosition, int childPosition) { // TODO Auto-generated method stub return mPhoneData.get(groupPosition).PhoneType.get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { // TODO Auto-generated method stub return childPosition; } //ChildView에 데이터 뿌리기 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { View view; if(convertView == null) { view = getChildGenericView(); } else { view = convertView; } TextView text = (TextView)view.findViewById(android.R.id.text1); text.setText(mPhoneData.get(groupPosition).PhoneType.get(childPosition)); return view; } @Override public int getChildrenCount(int groupPosition) { return mPhoneData.get(groupPosition).PhoneType.size(); } @Override public Object getGroup(int groupPosition) { return mPhoneData.get(groupPosition); } @Override public int getGroupCount() { return mPhoneData.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } //GroupView에 데이터 뿌리 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { View view; if(convertView == null) { view = getParentGenericView(); } else { view = convertView; } ImageView img = (ImageView)view.findViewById(R.id.img); img.setImageResource(mContext.getResources().getIdentifier("ic_launcher", "drawable", mContext.getPackageName())); TextView text = (TextView)view.findViewById(R.id.text); text.setText(mPhoneData.get(groupPosition).OS); return view; } @Override public boolean hasStableIds() { // TODO Auto-generated method stub return false; } @Override public boolean areAllItemsEnabled() { // TODO Auto-generated method stub return super.areAllItemsEnabled(); } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { // TODO Auto-generated method stub return false; } //Child의 View의 XML을 생성 public View getChildGenericView() { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(android.R.layout.simple_expandable_list_item_1, null); return view; } //Parent(Group)의 View의 XML을 생성 public View getParentGenericView() { LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.simple_expandable_list_item_1, null); return view; } }
Custom ListView xml - 리스트 뷰의 Custom
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/text" android:layout_width="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight" android:paddingStart="?android:attr/expandableListPreferredItemPaddingLeft" android:gravity="center_vertical" android:layout_weight="1" /> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="?android:attr/listPreferredItemHeight" android:scaleType="centerInside" android:layout_weight="0" /> </LinearLayout>
결과 화면
지난번에 작성한 것과는 내용만 다르고, Custom을 했다는것 말곤 전혀 차이가 없습니다. ExpandableListView 역시 UI커스텀도 가능합니다. 단 기본적으로 지원해주는 adapter를 사용하시면 커스텀 UI를 사용할 수 없고 위와 같이 구현하셔야 합니다. 이상으로 이번 글은 마치겠습니다. 역시 소스코드는 아래 주소로 다운로드 받으시면 됩니다.
소스코드 다운로드
'Android Develop' 카테고리의 다른 글
Android Settings를 통한 AirplaneMode 예제 코드 (4) | 2013.02.02 |
---|---|
ListView에 Swipe to Dismiss 적용하기(ICS이상에서 있는 Swipe 기능) (2) | 2013.01.26 |
ExpandableListView 단순 예제 (15) | 2013.01.16 |
Android Parcelable 인터페이스 구현 (2) | 2013.01.15 |
3단계로 간단하게 Android 개발 환경 만들기(Android Developer Tools) (2) | 2012.12.01 |
댓글