티스토리 뷰




 < 개발 환경 >  
   작성일 : 2013.02.25
   OS 설치 버전 : Windows7 32bit  
   SDK 설치 버전 : 안드로이드 SDK 4.2 (젤리빈) / API LEVEL : 17  
   ADT 설치 버전 : 21   
   Java 설치 버전 : JDK 1.6.0_20 / JRE6 
   이클립스 설치 버전 : Indigo
   테스트단말 : 삼성 갤럭시 S2 4.0.4 (아이스크램 샌드위치)   

 < 프로젝트 적용 > 
   Android Build Target / API LEVEL / Complie With : 17  
   minSdkVersion : 8 
   targetSdkVersion : 16  
   Java Compiler Level : 1.6  
   Text file encoding : UTF-8




안드로이드/Android ExpandableListView 만들기 - 2 - (속성 추가)





안드로이드 ExpandableListView 예제 입니다. 기존의 ExpandableListView 예제에서 몇가지 속성 사항들만 변형해서 만든 소스 입니다. ExpandableListView 자체에 대한 설명은  [안드로이드/Android ExpandableListView 만들기] 를 참고하시기 바랍니다.


자 그럼 예제를 살펴 보겠습니다.


package arabiannight.tistory.com.expandablelistviewattribute.activity;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.Toast;
import arabiannight.tistory.com.expandablelistviewattribute.R;
import arabiannight.tistory.com.expandablelistviewattribute.adapter.BaseExpandableAdapter;

public class TestExpandableListViewActivity extends Activity {

	private ArrayList mGroupList = null;
	private ArrayList> mChildList = null;
	private ArrayList mChildListContent = null;
	private BaseExpandableAdapter mBaseExpandableAdapter = null;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test_expandable_list_view);

		setLayout();

		mGroupList = new ArrayList();
		mChildList = new ArrayList>();
		mChildListContent = new ArrayList();

		mGroupList.add("가위");
		mGroupList.add("바위");
		mGroupList.add("보");

		mChildListContent.add("1");
		mChildListContent.add("2");
		mChildListContent.add("3");

		mChildList.add(mChildListContent);
		mChildList.add(mChildListContent);
		mChildList.add(mChildListContent);

		mBaseExpandableAdapter = new BaseExpandableAdapter(this, mGroupList, mChildList);
		mListView.setAdapter(mBaseExpandableAdapter);
		
		// 그룹 Indiacator 삭제 (그룹 왼쪽에 기본제공되는 화살표 아이콘 삭제)
		mListView.setGroupIndicator(null);
		
		// 처음 시작시 그룹 모두 열기 (expandGroup)
//		int groupCount = (int) mBaseExpandableAdapter.getGroupCount();
//		for (int i = 0; i < groupCount; i++) {
//			mListView.expandGroup(i);
//		}
		
		// 처음 시작시 그룹 모두 닫기 (collapseGroup)
//		for (int i = 0; i < groupCount; i++) {
//			mListView.collapseGroup(i);
//		}
		
		// 그룹 클릭 했을 경우 이벤트
		mListView.setOnGroupClickListener(new OnGroupClickListener() {
			@Override
			public boolean onGroupClick(ExpandableListView parent, View v,
					int groupPosition, long id) {
				Toast.makeText(getApplicationContext(), "g click = " + groupPosition, 
						Toast.LENGTH_SHORT).show();
				
				// Listener 에서 Adapter 사용법 (getExpandableListAdapter 사용해야함.)
				// BaseExpandableAdpater에 오버라이드 된 함수들을 사용할 수 있다.
				int groupCount = (int) parent.getExpandableListAdapter().getGroupCount();
				int childCount = (int) parent.getExpandableListAdapter().getChildrenCount(groupPosition);
				
				return false;
			}
		});
		
		// 차일드 클릭 했을 경우 이벤트
		mListView.setOnChildClickListener(new OnChildClickListener() {
			@Override
			public boolean onChildClick(ExpandableListView parent, View v,
					int groupPosition, int childPosition, long id) {
				Toast.makeText(getApplicationContext(), "c click = " + childPosition, 
						Toast.LENGTH_SHORT).show();
				return false;
			}
		});
		
		// 그룹이 닫힐 경우 이벤트
		mListView.setOnGroupCollapseListener(new OnGroupCollapseListener() {
			@Override
			public void onGroupCollapse(int groupPosition) {
				Toast.makeText(getApplicationContext(), "g Collapse = " + groupPosition, 
						Toast.LENGTH_SHORT).show();
			}
		});
		
		// 그룹이 열릴 경우 이벤트
		mListView.setOnGroupExpandListener(new OnGroupExpandListener() {
			@Override
			public void onGroupExpand(int groupPosition) {
				Toast.makeText(getApplicationContext(), "g Expand = " + groupPosition, 
						Toast.LENGTH_SHORT).show();
				
				int groupCount = mBaseExpandableAdapter.getGroupCount();
				
				// 한 그룹을 클릭하면 나머지 그룹들은 닫힌다.
				for (int i = 0; i < groupCount; i++) {
					if (!(i == groupPosition))
						mListView.collapseGroup(i);
				}
			}
		});
	}

	/*
	 * Layout
	 */
	private ExpandableListView mListView;

	private void setLayout(){
		mListView = (ExpandableListView) findViewById(R.id.elv_list);
	}
}
//



예제 에서 보시는 바와 같이 마지막으로 그룹을 클릭한 경우에만 펼쳐지고 나머지 그룹들은 닫히게 되는 코드를 추가 하였고 어플 처음실행시 Group 들은 모두 펼침 상태와, 모두 닫힘 상태로 만들 수 있는 코드를 추가 하였습니다. 주석만 풀고 사용하시기 바랍니다.


그리고 예제들을 조금씩만 변형시키면 원하시는 기능을 만들 수 있으니 유용하게 활용 하시기 바랍니다.



파일첨부 : 

TestExpandableListViewAttribute.zip




스크린샷 :

 

 

 






댓글
  • 프로필사진 SDK 안녕하세요. 아라비안나이트님
    Json 파싱하여 익스펜더블 리스트뷰를 활용해서 만들고 싶은데
    잘 안되네요.ㅠ
    어떤 방식으로 해야할지 도움이 필요해요~
    2013.03.11 16:16
  • 프로필사진 아라비안왕자 정상적으로 Json 파싱을 하셨다면, ExpandableListview Adapter에서 사용할 [][] 이중 배열에 값이 들어 갔나 확인만 잘 해주시면 됩니다. Group Position과 Child Position 의 값이 재대로 들어있나 확인해 주세요.^^ !! 2013.03.14 01:08 신고
  • 프로필사진 이건휘 안녕하세요.안드로이드에서 질문이 있습니다.
    public class intro extends Activity implements OnChildClickListener{

    MyDBHelper myDBHelper;

    ExpandableListView eList;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.nudle);

    //데이타베이스에서 내용을 읽어와서 daic 배열과, soc 배열내용을 채워준다.

    // SQLOpenHelper의 도움을 받아 데이타베이스와 테이블을 생성한다.
    myDBHelper = new MyDBHelper(this, "nuli.DB", null, 1);

    //sql 데이터 결과 얻기

    SQLiteDatabase db = myDBHelper.getReadableDatabase();

    String sql;

    //Log.i("SQLiteTest1", "길이:" + searchWord.length());


    sql = "SELECT daic, count(*) FROM nudle GROUP BY daic;";


    Log.i("nudleTest1", sql);
    Cursor cursor;
    Cursor cursor1;

    cursor = db.rawQuery(sql, null);


    //그룹데이터
    //String daic[];

    //그룹 상세데이타
    //String soc[][];

    //그룹데이터
    String daic[] = new String[8];
    int countArr[] = new int[8];
    int k=0;
    while(cursor.moveToNext()){
    daic[k] = cursor.getString(0);
    countArr[k] = cursor.getInt(1);
    Log.i("nudleTest1", daic[k] + " " + countArr[k]);
    k++;
    }


    //그룹 상세데이타
    //String soc[][] = new String[10][10];


    for( int i = 0; i< daic.length; i++){
    String category = daic[i];

    String sql1;

    sql1 = "SELECT soc FROM nudle WHERE daic = '" + category + "';";

    Log.i("nudleTest1", sql1);


    cursor1 = db.rawQuery(sql1, null);
    //실행시킨 커서 객체를

    String soc[][] = new String[i][10];
    int countArr1[][] = new int[i][10];

    int v = 0;

    while(cursor1.moveToNext()){
    for( int u = 0; u< daic.length; u++){
    String category2 = soc[i][v];
    //i행 v열에 값기억
    String sql2;

    sql2 = "SELECT soc FROM nudle WHERE daic = '" + category + "';";

    Log.i("nudleTest2", sql2);
    //soc배열 i행과 v열
    soc[i][v] = cursor1.getString(0);
    Log.i("nudleTest3", soc[i][v]);

    //u는 0이고 u가 대카테고리의 길이보다 작은동안 u는 늘어난다.


    v++;
    }
    }
    }

    }
    이 라는 부분을 만들고 있습니다. ExpandableListView에 넣으려고 daic[],soc[][] 를 선언했는데 sql에서 daic부분에는 제가 원하는 부분이
    들어가는데 soc 부분에는 들어가지 않아서 질문을 드립니다.

    05-23 15:59:17.791: W/ActivityThread(1901): Application com.jica.nudle is waiting for the debugger on port 8100...
    05-23 15:59:17.841: I/System.out(1901): Sending WAIT chunk
    05-23 15:59:17.862: I/dalvikvm(1901): Debugger is active
    05-23 15:59:18.041: I/System.out(1901): Debugger has connected
    05-23 15:59:18.052: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.251: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.451: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.651: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:18.851: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.051: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.296: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.491: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.691: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:19.929: I/System.out(1901): waiting for debugger to settle...
    05-23 15:59:20.133: I/System.out(1901): debugger has settled (1392)
    05-23 15:59:21.751: D/gralloc_goldfish(1901): Emulator without GPU emulation detected.
    05-23 15:59:24.951: I/nudleTest1(1901): SELECT daic, count(*) FROM nudle GROUP BY daic;
    05-23 15:59:24.971: I/nudleTest1(1901): 국수 2
    05-23 15:59:24.981: I/nudleTest1(1901): 라면 3
    05-23 15:59:24.981: I/nudleTest1(1901): 컵라면 3
    05-23 15:59:24.981: I/nudleTest1(1901): 파스타 2
    05-23 15:59:24.981: I/nudleTest1(1901): SELECT soc FROM nudle WHERE daic = '국수';
    로그인데 daic에 포함된 soc 부분이 나오지 않고 여기서 디버깅이 멈추네요. 부탁드립니다.
    wnsrjs23@naver.com으로 부탁드려도 될까요?
    2013.05.23 16:09
  • 프로필사진 비밀댓글입니다 2013.05.27 16:38
  • 프로필사진 건덱 ArrayList<String>형으로 하는건 성공했는데 custom하여 ArrayList<class> 형식으로 만들려보니 add에서 계속 오류가 발생합니다.
    그룹에 텍스트뷰 2개 차일드에 텍스트뷰5개가 있는데 어떻게 해야될지 모르겠습니다.
    2013.07.26 16:42
  • 프로필사진 비밀댓글입니다 2013.08.29 19:26
  • 프로필사진 강보경 레벨을 더 넣고 싶은데 어디를 수정해야하나요? 2013.12.05 14:27
  • 프로필사진 가영범 딱 1년전 오늘 글이네요..ㅎㅎ 늘 아라비안나이트님 글을 참고하며 안드로이드 구현중인 개발자입니다.
    ExpandableListView 구현중에 질문이 있어서 남겨봅니다.

    ExpandableListView라는것은 group를 클릭시에 확장된다는게 기본인가요?

    구현하고자 하는 디자인이, group을 클릭시에는 다른 화면으로 화면전환이 이루어지고, group중에 버튼이 하나 있는데, 그 버튼을 클릭시에
    ExpandableListView가 child를 보여주게 확장되게끔 할 수는 없는건지 궁금합니다. 여기저기 찾아보고 있는데, 기본적으로 ExpandableListView
    는 group클릭시 무조건 확장되고 닫히는거 같은데... ㅠ 확장되게끔 하는 터치영역을 바꿀수 있는 방법이 있을까요?
    2014.02.25 12:21
댓글쓰기 폼