Hello,

kok nae-ga ha-myun an-dweneun MAGIC...🧚

안드로이드

custom expandableListView 구현하기

✿도담도담 2018. 4. 17. 22:58

초보다 보니 원하는 것을 구현하기 까지 정말 힘들다 ㅠ_ㅠ...

배우지도 않았는데 앱 만드는 과제를 해야하니

맨땅에 해딩중이다...


게시글 형태를 나타내는데 댓글을 밑에 나타내고싶어서

기존에 포스팅했던 custom listview에서 한단계 올라간

custom expandableListView를 만들었다.


custom listview에서 비슷하지만 group과 child 두개를 만들어주어야한다.



우선 구현한 화면이다.

아직 화면 구성을 이쁘게 다듬지 않아서 부실하지만...

성공은 했으니까..ㅎ.ㅎ;;


레이아웃 코드가 길어서 생략하겠다.

없겠지만 혹시 필요하시다면 댓글 달아주세요 :)

레이아웃은 총 activity_main.xml  group_listview.xml child_listview.xml

이렇게 총 3개가 필요하다.


다음으로 custom expandable listview의 어댑터 부분이다.

( 데이터를 set하는 부분은 하지 않았다. 

layout에서 초기 설정한 그대로 뜬다.

이부분은 getGroupView와 getChildView에서 해주면 된다. )


package com.mini_mo.myapplication;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;


public class CustomAdapter extends BaseExpandableListAdapter {

private Context c;
private ArrayList<GroupData> groupDatas;
private LayoutInflater inflater;

public CustomAdapter(Context c, ArrayList<GroupData> groupData)
{
this.c = c;
groupDatas = groupData;
inflater=(LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}


/* Child List Data */

@Override // groupPostion과 childPosition을 통해 childList의 원소를 얻어옴
public Object getChild(int groupPos, int childPos) {
// TODO Auto-generated method stub
return groupDatas.get(groupPos).childs.get(childPos);
}

@Override // ChildList의 ID로 long 형 값을 반환
public long getChildId(int arg0, int arg1) {
// TODO Auto-generated method stub
return 0;
}

@Override // ChildList의 View. Layout 연결 후, layout 내 데이터를 연결
public View getChildView(int groupPos, int childPos, boolean isLastChild, View convertView, ViewGroup parent)
{
//ONLY INFLATER XML ROW LAYOUT IF ITS NOT PRESENT,OTHERWISE REUSE IT
if(convertView==null)
{
convertView=inflater.inflate(R.layout.child_listview, null);
}

//GET CHILD
String child= (String) getChild(groupPos, childPos);

//SET CHILD NAME
TextView nameTv=(TextView) convertView.findViewById(R.id.textView1);
ImageView img=(ImageView) convertView.findViewById(R.id.imageView1);

// 데이터 set

return convertView;
}

@Override // ChildList의 크기를 int 형으로 반환
public int getChildrenCount(int groupPosw) {
// TODO Auto-generated method stub
return groupDatas.get(groupPosw).childs.size();
}

/* Paren tList View */

@Override // groupDatas의 position을 받아 해당 view에 반영될 String을 반환
public Object getGroup(int groupPos) {
// TODO Auto-generated method stub
return groupDatas.get(groupPos);
}

@Override // groupDatas의 원소 개수를 반환
public int getGroupCount() {
// TODO Auto-generated method stub
return groupDatas.size();
}

//GET TEAM ID
@Override // ParentList의 position을 받아 long값으로 반환
public long getGroupId(int arg0) {
// TODO Auto-generated method stub
return 0;
}

//GET TEAM ROW
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {

//ONLY INFLATE XML TEAM ROW MODEL IF ITS NOT PRESENT,OTHERWISE REUSE IT
if(convertView == null)
{
convertView=inflater.inflate(R.layout.group_listview, null);
}

//GET GROUP
GroupData t=(GroupData) getGroup(groupPosition);

// DATA SET
return convertView;
}

@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}

@Override // ChildView 선택 가능 여부
public boolean isChildSelectable(int arg0, int arg1) {
// TODO Auto-generated method stub
// false : 선택 불가능
// true : 선택 가능
return true;
}

}


그리고 MainActivity에 onCreate 함수 부분이다.


/*   GroupData와 ChildData 입력   */
/* ExpandableListViewAdapter 지정 */
ExpandableListView list=(ExpandableListView) findViewById(R.id.expandableListView);

ArrayList<GroupData> groupDatas = getData();

//CREATE AND BIND TO ADAPTER
CustomAdapter adapter=new CustomAdapter(this, groupDatas);
list.setAdapter(adapter);


getData() 라는 메소드를 아래에 만들어서

값을 추가해 주었다.


시간이 없어서 간략하게 적어 봤다.

나름 여러개의 블로그를 보고 한줄한줄 치면서

3번의 실패 끝에 성공했다 ㅠ_ㅠ...


예제가 전부 사진하나에 텍스트 하나라서

다양하게 커스텀 못하는줄 알았다...;

쨋뜬 그냥 listView랑 똑같다.


단지 child만 들어간건데

왜 이렇게 어려웠는지..


*문제점*이 하나 있었는데

그룹뷰에서 버튼이나 에디트텍스트 같은 뷰들을 넣으면

그룹뷰 클릭시 자식뷰들이 펼쳐지지 않았다.

따로 버튼을 클릭했을 때의 함수를 만들어 주면 괜찮았을것 같기도 하다.

이것 때문에 시간을 좀 날렸다.

왜 안되는지 알면 댓글로 알려주시면...ㅠ_ㅠ감사하겠..습니다...


- 끝 :D -