안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^ |
안드로이드 확장 리스트 뷰 => ExpandableListView => 중첩 리스트뷰에 대해 알아보겠씁니다^^
아래 사진처럼 리스트뷰 안에 또 다른 리스트 뷰가 있는 구조의 리스트 뷰를 확장 리스트뷰 즉, ExpandableListView라고 합니다.
필요한 xml은 ExpandableListView를 선언할 xml +
부모의 아이템이 될 parent_row.xml 그리고 부모 아이템을 선택했을 떄
펼쳐지게 될 child_row.xml 입니다.
그리고 필요한 자바 파일은 MainActivity.java, 그리고 Adapter.java, Parent.java, Child.java입니다.
바로 예제를 보겠씁니다.
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/parentListView" />
</LinearLayout>
parent_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="60dp"
android:weightSum="3">
<TextView style="@style/parent_row"
android:id="@+id/name"/>
<TextView style="@style/parent_row"
android:id="@+id/age"/>
<TextView style="@style/parent_row"
android:id="@+id/gender"/>
</LinearLayout>
child.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="48dp">
<TextView style="@style/child_row"
android:id="@+id/phone"
android:layout_marginStart="16dp"/>
<TextView style="@style/child_row"
android:id="@+id/address"/>
</LinearLayout>
xml은 뭐 자신이 만들고 싶은 디자인으로 만들면 되겠죠?? ㅋㅋㅋㅋㅋ
바로 자바 파일입니다.
Child.java
public class Child {
private String phone;
private String address;
public Child(String phone, String address) {
this.phone = phone;
this.address= address;
}
String getPhone() {
return this.phone;
}
String getAdddress() {
return this.address;
}
}
Parent.java
public class ParentData {
private String name;
private int age;
private String gender;
public Vector<Child> child;
public ParentData(String name, int age, String gender) {
this.name= name;
this.age= age;
this.gender= gender;
child = new Vector<>();
}
String getName() {
return this.name;
}
String getUser() {
return this.age;
}
String getStatus() {
return this.gender;
}
}
Parent.Adapter.java => BaseExpandableListAdapter를 상속받게 되는데요, 10개의 메서드를 오버라이딩하면 됩니다.
아마 아래 예제 코드를 보고 따라하시면 큰 무리 없으실 거에요
오버라이딩한 메서드들 안의 코드는 기존에 리스트뷰를 사용해보신 분들이라면 다들 아실거라고 생각하니까
설명은 하지않겠습니다 ㅎㅎ
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import java.util.Vector;
import yeogiyo.jumo.R;
public class ParentAdapter extends BaseExpandableListAdapter {
private static final int PARENT_ROW = R.layout.parent_row;
private static final int CHILD_ROW = R.layout.child_row;
private Context context;
private Vector<ParentData> data;
private LayoutInflater inflater = null;
public ParentAdapter(Context context, Vector<ParentData> data){
this.data = data;
this.context = context;
this.inflater =
(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public View getGroupView(int groupPosition,
boolean isExpanded, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(PARENT_ROW, parent, false);
}
TextView name = (TextView) convertView.findViewById(R.id.name);
TextView age = (TextView) convertView.findViewById(R.id.age);
TextView gender = (TextView) convertView.findViewById(R.id.gender);
bandOrBell.setText(data.get(groupPosition).getName());
users.setText(data.get(groupPosition).getAge()+"");
status.setText(data.get(groupPosition).getGender());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(CHILD_ROW, parent, false);
}
TextView phone = (TextView) convertView.findViewById(R.id.phone);
TextView address = (TextView) convertView.findViewById(R.id.address);
phone.setText(data.get(groupPosition).child.get(childPosition).getPhone());
address.setText(data.get(groupPosition).child.get(childPosition).getAddress());
return convertView;
}
@Override
public int getGroupCount() {
return data.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return data.get(groupPosition).child.size();
}
@Override
public Object getGroup(int groupPosition) {
return data.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return data.get(groupPosition).child.get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
MainActicity.java
public class MainActivity extends AppCompatActivity {
private static final int LAYOUT = R.layout.activity_main;
private ExpandableListView parentListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(LAYOUT);
Vector<ParentData> data = new Vector<>();
parentListView = (ExpandableListView)findViewById(R.id.parentListView);
ParentData parentData1 = new ParentData("알통몬", "26", "남자");
parentData1.child.add(new Child("01011111111", "서울 서대문구"));
data.add(parentData1);
ParentData parentData2 = new ParentData("근육몬", "28", "남자");
parentData2.child.add(new Child("01022222222", "부산 서구"));
data.add(parentData2);
ParentAdapter adapter = new ParentAdapter(getContext(),data);
parentListView.setAdapter(adapter);
}
Class나 xml 내용들은 첫번째 사용한 사진과는 다르게 조금 수정해봤습니다 ^^
도움이 되셨다면 공감을 ~~
이해가 안되시는 부분은 댓글로 주시면 답글달겠습니닷!!