티스토리 뷰
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 |
Android ExpandableListView Custom 예제 (8) | 2013.01.21 |
ExpandableListView 단순 예제 (15) | 2013.01.16 |
Android Parcelable 인터페이스 구현 (2) | 2013.01.15 |
3단계로 간단하게 Android 개발 환경 만들기(Android Developer Tools) (2) | 2012.12.01 |
댓글
-
Yang SRyang 이 정말 좋은 페이지입니다 2013.03.29 00:45
-
taehwan 감사합니다! 2013.03.29 09:41 신고
-
이동호 정말 좋은 소스같습니다!!
하나 질문 드리고 싶은데
이것을 이용해서 조금변형시켜서 제가
ArrayList<String> jungrang = new ArrayList<String>();
for (String s : getResources().getStringArray(R.array.jungrang)) {
windows.add(s);
}
obj.add(jungrang);
이런식으로 child를 추가시켯는데
group을 늘리고 child도 늘렸는데
기본 4개 지정되있는 것밖에 child가 뜨지 않네요 ㅠㅠ
무엇때문에 그러는거죠???
whffuqjdu@naver.com
여기로 메일하나만 보내주시면 감사하겠습니다 ㅠㅠ
부탁드립니다!! 2013.08.21 23:34 -
taehwan 메일로 답변 드렸습니다. 2013.08.22 20:47 신고
-
이동호 개발자님 메일하나 보냈으니 다시 확인좀 부탁드릴게요!ㅜㅠㅠ 2013.08.23 20:23
-
taehwan 답변 보내드렸습니다. 2013.08.24 09:41 신고
-
taehwan 해당 샘플이 없을거에요. 다시 작성해야해서.. 2017.07.04 09:33 신고
- Total
- 5,774,618
- Today
- 234
- Yesterday
- 612
- Dropbox
- kotlin
- 넥서스 9
- 윈도우 맥 원격 접속 프로그램
- 태그를 입력해 주세요.
- 코틀린
- Google HackFair
- dropbox api
- C언어 note 작성
- 구글 픽셀
- google drive
- Pixel XL
- 이슈
- HTC EVO4G 업데이트
- 개봉기
- Android MVP
- 리뷰
- 카카오톡
- RxJava
- Splashtop Remote Desktop
- IT
- 안드로이드 MVP
- 픽셀 XL
- Facebook Messenger
- 안드로이드 원격 컨트롤
- Android
- 안드로이드 원격
- 윈도우 원격
- 안드로이드
- 코루틴