- แก้ไขไฟล์ activity_main.xml
- แก้ไขไฟล์ MainActivity.java
- เพิ่ม Package ชื่อ ExpandableList
- เพิ่มไฟล์ ชื่อ ExpandableList/ChildItem.java และ layout/child_item.xml
- เพิ่มไฟล์ ชื่อ ExpandableList/GroupItem.java และ layout/group_item.xml
- เพิ่มไฟล์ ชื่อ ExpandableList/ChildViewHolder.java และ ExpandableList/GroupViewHolder.java
- เพิ่มไฟล์ ชื่อ ExpandableList/CustomAdapter.java
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <ExpandableListView android:id="@+id/expandableListView" android:layout_width="match_parent" android:layout_height="match_parent" android:indicatorLeft="?android:attr/expandableListPreferredItemIndicatorLeft" android:listSelector="#ffc" /> </LinearLayout>
MainActivity.java
package com.phaisarn.expandable; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.ExpandableListView; import android.widget.Toast; import com.phaisarn.expandable.ExpandableList.ChildItem; import com.phaisarn.expandable.ExpandableList.CustomAdapter; import com.phaisarn.expandable.ExpandableList.GroupItem; import java.util.ArrayList; import java.util.Arrays; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final ExpandableListView expandableListView = findViewById(R.id.expandableListView); final ArrayList<GroupItem> groupArray = new ArrayList<>(); ArrayList<ChildItem> childArray; GroupItem groupItem; String groupName; groupName = "Asia"; childArray = new ArrayList<>(); childArray.addAll(Arrays.asList( new ChildItem("Thailand"), new ChildItem("Japan"), new ChildItem("Korea"))); groupItem = new GroupItem(groupName, childArray); groupArray.add(groupItem); groupName = "Europe"; childArray = new ArrayList<>(); childArray.addAll(Arrays.asList( new ChildItem("UK"), new ChildItem("France"), new ChildItem("Germany"), new ChildItem("Spain"))); groupItem = new GroupItem(groupName, childArray); groupArray.add(groupItem); groupName = "America"; childArray = new ArrayList<>(); childArray.addAll(Arrays.asList( new ChildItem("USA"), new ChildItem("Canada"), new ChildItem("Mexico"))); groupItem = new GroupItem(groupName, childArray); groupArray.add(groupItem); groupName = "Africa"; childArray = new ArrayList<>(); childArray.addAll(Arrays.asList( new ChildItem("Nigeria"), new ChildItem("Cameroon"), new ChildItem("Morocco"))); groupItem = new GroupItem(groupName, childArray); groupArray.add(groupItem); groupName = "Latin"; childArray = new ArrayList<>(); childArray.addAll(Arrays.asList( new ChildItem("Brazil"), new ChildItem("Argentina"), new ChildItem("Peru"), new ChildItem("Chile"))); groupItem = new GroupItem(groupName, childArray); groupArray.add(groupItem); CustomAdapter adapter = new CustomAdapter(this, groupArray); expandableListView.setAdapter(adapter); expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView exp, View view, int i, int i1, long l) { //ใช้เมธอดของคลาส GroupItem และ ChildItem String item = groupArray.get(i).childItems.get(i1).text; Toast.makeText(getBaseContext(), item, Toast.LENGTH_SHORT).show(); return true; } }); } }
ExpandableList/ChildItem.java
package com.phaisarn.expandable.ExpandableList; public class ChildItem { public String text; public ChildItem(String text) { this.text = text; } }
layout/child_item.xml
<?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="match_parent" android:descendantFocusability="blocksDescendants" android:orientation="vertical"> <TextView android:id="@+id/child_textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingBottom="7dp" android:paddingLeft="40dp" android:paddingTop="7dp" android:textSize="16sp" /> </LinearLayout>
ExpandableList/GroupItem.java
package com.phaisarn.expandable.ExpandableList; import java.util.ArrayList; public class GroupItem { public String text; public ArrayList<ChildItem> childItems; public GroupItem(String text, ArrayList<ChildItem> childItems) { this.text = text; this.childItems = childItems; } }
layout/group_item.xml
<?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="match_parent" android:background="#def" android:orientation="vertical"> <TextView android:id="@+id/group_textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="40dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:textSize="20sp" /> </LinearLayout>
ExpandableList/ChildViewHolder.java
package com.phaisarn.expandable.ExpandableList; import android.view.View; import android.widget.TextView; import com.phaisarn.expandable.R; public class ChildViewHolder { TextView textView; public ChildViewHolder(View view) { textView = view.findViewById(R.id.child_textView); } }
ExpandableList/GroupViewHolder.java
package com.phaisarn.expandable.ExpandableList; import android.view.View; import android.widget.TextView; import com.phaisarn.expandable.R; public class GroupViewHolder { TextView textView; public GroupViewHolder(View view) { textView = view.findViewById(R.id.group_textView); } }
ExpandableList/CustomAdapter.java
package com.phaisarn.expandable.ExpandableList; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import com.phaisarn.expandable.R; import java.util.ArrayList; public class CustomAdapter extends BaseExpandableListAdapter { private Context mContext; private ArrayList<GroupItem> mGroupItems; private GroupViewHolder mGroupHolder; private ChildViewHolder mChildHolder; public CustomAdapter(Context context, ArrayList<GroupItem> items) { mContext = context; mGroupItems = items; } @Override public int getGroupCount() { return mGroupItems.size(); } //ให้ gPos => groupPosition, cPos => childPosition @Override public int getChildrenCount(int gPos) { return mGroupItems.get(gPos).childItems.size(); } @Override public Object getGroup(int gPos) { return mGroupItems.get(gPos); } @Override public Object getChild(int gPos, int cPos) { return null; } @Override public long getGroupId(int gPos) { return gPos; } @Override public long getChildId(int gPos, int cPos) { return cPos; } @Override public boolean hasStableIds() { return true; } @Override public boolean isChildSelectable(int gPos, int cPos) { return true; } @Override public View getGroupView(int gPos, boolean isLast, View view, ViewGroup viewGroup) { if (view == null) { LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.inflate(R.layout.group_item, viewGroup, false); mGroupHolder = new GroupViewHolder(view); view.setTag(mGroupHolder); } else { mGroupHolder = (GroupViewHolder) view.getTag(); } GroupItem groupItemInfo = (GroupItem) getGroup(gPos); mGroupHolder.textView.setText(groupItemInfo.text); return view; } @Override public View getChildView(int gPos, int cPos, boolean isLast, View view, ViewGroup viewGroup) { if (view == null) { LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.inflate(R.layout.child_item, viewGroup, false); mChildHolder = new ChildViewHolder(view); view.setTag(mChildHolder); } else { mChildHolder = (ChildViewHolder) view.getTag(); } ArrayList<ChildItem> childItems = mGroupItems.get(gPos).childItems; mChildHolder.textView.setText(childItems.get(cPos).text); return view; } }