ExpandableListViews实现点击隐藏和展开的效果
实现效果图:
(1)activity_main.xml,添加控件
<ExpandableListView android:id="@+id/expandable_list" android:layout_width="match_parent" android:layout_height="match_parent"/>
(2)item_expand_child.xml,这里是展开列表的布局,需要自己新建
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/label_expand_child" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="16sp" android:paddingTop="8dp" android:paddingBottom="8dp" tools:text="测试数据"/>
(3)item_expand_group_normal.xml,这里是默认列表的布局,需要自己新建
<?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/label_group_normal" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:color/holo_blue_light" android:gravity="center_vertical" android:paddingBottom="8dp" android:paddingLeft="32dp" android:paddingTop="8dp" android:textColor="@android:color/white" android:textSize="20sp" tools:text="测试数据"/>
(4)新建一个接口OnGroupExpandedListener,实现分组位置设置
public interface OnGroupExpandedListener { /** * 分组展开 * * @param groupPosition 分组的位置 */ void onGroupExpanded(int groupPosition); }
(5)新建一个数组集合类,Constant
public final class Constant { public static final String[] BOOKS = {"西游记", "水浒传", "三国演义", "红楼梦"}; public static final String[][] FIGURES = { {"唐三藏", "孙悟空", "猪八戒", "沙和尚"}, {"宋江", "林冲", "李逵", "鲁智深"}, {"曹操", "刘备", "孙权", "诸葛亮", "周瑜"}, {"贾宝玉", "林黛玉", "薛宝钗", "王熙凤"} }; public static final String BOOK_NAME = "book_name"; public static final String FIGURE_NAME = "figure_name"; }
(6)在主界面里面设置适配器和点击事件,MainActivity
public class MainActivity extends AppCompatActivity { private static final String TAG = "NormalExpandActivity"; private ExpandableListView mExpandableListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mExpandableListView = (ExpandableListView) findViewById(R.id.expandable_list); final NormalExpandableListAdapter adapter = new NormalExpandableListAdapter(Constant.BOOKS, Constant.FIGURES); mExpandableListView.setAdapter(adapter); adapter.setOnGroupExpandedListener(new OnGroupExpandedListener() { @Override public void onGroupExpanded(int groupPosition) { expandOnlyOne(groupPosition); } }); // 设置分组项的点击监听事件 mExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { Log.d(TAG, "onGroupClick: groupPosition:" + groupPosition + ", id:" + id); // 请务必返回 false,否则分组不会展开 return false; } }); // 设置子选项点击监听事件 mExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { Toast.makeText(MainActivity.this, Constant.FIGURES[groupPosition][childPosition], Toast.LENGTH_SHORT).show(); return true; } }); } // 每次展开一个分组后,关闭其他的分组 private boolean expandOnlyOne(int expandedPosition) { boolean result = true; int groupLength = mExpandableListView.getExpandableListAdapter().getGroupCount(); for (int i = 0; i < groupLength; i++) { if (i != expandedPosition && mExpandableListView.isGroupExpanded(i)) { result &= mExpandableListView.collapseGroup(i); } } return result; } }
(7)新建一个适配器NormalExpandableListAdapter
public class NormalExpandableListAdapter extends BaseExpandableListAdapter { private static final String TAG = "NormalExpandableListAda"; private String[] groupData; private String[][] childData; private OnGroupExpandedListener mOnGroupExpandedListener; public NormalExpandableListAdapter(String[] groupData, String[][] childData) { this.groupData = groupData; this.childData = childData; } public void setOnGroupExpandedListener(OnGroupExpandedListener onGroupExpandedListener) { mOnGroupExpandedListener = onGroupExpandedListener; } @Override public int getGroupCount() { return groupData.length; } @Override public int getChildrenCount(int groupPosition) { return childData[groupPosition].length; } @Override public Object getGroup(int groupPosition) { return groupData[groupPosition]; } @Override public Object getChild(int groupPosition, int childPosition) { return childData[groupPosition][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 View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { GroupViewHolder groupViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_group_normal, parent, false); groupViewHolder = new GroupViewHolder(); groupViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.label_group_normal); convertView.setTag(groupViewHolder); } else { groupViewHolder = (GroupViewHolder) convertView.getTag(); } groupViewHolder.tvTitle.setText(groupData[groupPosition]); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ChildViewHolder childViewHolder; if (convertView == null) { convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_expand_child, parent, false); childViewHolder = new ChildViewHolder(); childViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.label_expand_child); convertView.setTag(childViewHolder); } else { childViewHolder = (ChildViewHolder) convertView.getTag(); } childViewHolder.tvTitle.setText(childData[groupPosition][childPosition]); return convertView; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public void onGroupExpanded(int groupPosition) { Log.d(TAG, "onGroupExpanded() called with: groupPosition = [" + groupPosition + "]"); if (mOnGroupExpandedListener != null) { mOnGroupExpandedListener.onGroupExpanded(groupPosition); } } @Override public void onGroupCollapsed(int groupPosition) { Log.d(TAG, "onGroupCollapsed() called with: groupPosition = [" + groupPosition + "]"); } private static class GroupViewHolder { TextView tvTitle; } private static class ChildViewHolder { TextView tvTitle; } }