ExpandableListView的用法,可以点击展开数据, 效果图如下:
import android.content.Context; import android.content.Intent; import android.view.View; import android.widget.ExpandableListView; import com.hjqjl.whdemo.adapter.MyExpandableListViewAdapter; import com.hjqjl.whdemo.databinding.ActivityMyExpandableListviewBinding; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class MyExpandableListViewActivity extends BaseActivity { public static void actionStart(Context context) { Intent intent = new Intent(context, MyExpandableListViewActivity.class); context.startActivity(intent); } private ActivityMyExpandableListviewBinding binding; private List<String> parentData; private Map<String, List<String>> childDataMap; @Override protected void initData() { binding = ActivityMyExpandableListviewBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); parentData = new ArrayList<>(); childDataMap = new HashMap<>(); addInfo("1、111111111?", new String[]{"11111111111"}); addInfo("2、222222?", new String[]{"222", "22222", "2222"}); addInfo("3、3333333333?", new String[]{"3333", "3333333"}); addInfo("4、444444444444?", new String[]{"44444", "44444"}); addInfo("5、5555555555?", new String[]{"555555555"}); binding.exLvMyExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() { @Override public void onGroupExpand(int groupPosition) { for (int i = 0, count = binding.exLvMyExpandableListView.getExpandableListAdapter().getGroupCount(); i < count; i++) { if (groupPosition != i) {// 关闭其他分组 binding.exLvMyExpandableListView.collapseGroup(i); } } } }); } @Override protected void processLogic() { binding.exLvMyExpandableListView.setAdapter(new MyExpandableListViewAdapter(mContext, parentData, childDataMap)); } /** * 给组、子列表添加数据 * * @param p -parentData * @param c -child */ private void addInfo(String p, String[] c) { parentData.add(p); List<String> childItem = new ArrayList<>(); Collections.addAll(childItem, c); childDataMap.put(p, childItem); } }其中的布局 activity_my_expandable_listview.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" android:orientation="vertical"> <!--android:groupIndicator="@null" 去掉ExpandableListView自带的默认的展开、收起箭头--> <ExpandableListView android:id="@+id/exLv_myExpandableListView" android:layout_width="match_parent" android:layout_height="wrap_content" android:groupIndicator="@null" /> </LinearLayout>重写adapter,实现数据的载入
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 com.hjqjl.whdemo.R; import java.util.List; import java.util.Map; public class MyExpandableListViewAdapter extends BaseExpandableListAdapter { private Context mContext; private List<String> mParentData; private Map<String, List<String>> mChildDataMap; public MyExpandableListViewAdapter(Context context, List<String> parentData, Map<String, List<String>> childDataMap) { this.mContext = context; this.mParentData = parentData; this.mChildDataMap = childDataMap; } @Override public int getGroupCount() { return mParentData.size(); } // 获取当前父item下的子item的个数 @Override public int getChildrenCount(int groupPosition) { String key = mParentData.get(groupPosition); return mChildDataMap.get(key).size(); } // 获取当前父item的数据 @Override public Object getGroup(int groupPosition) { return mParentData.get(groupPosition); } // 得到子item需要关联的数据 @Override public Object getChild(int groupPosition, int childPosition) { String key = mParentData.get(groupPosition); return (mChildDataMap.get(key).get(childPosition)); } @Override public long getGroupId(int groupPosition) { return groupPosition; } // 得到子item的ID @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } //是否指定分组视图及其子视图的ID对应的后台数据改变也会保持该ID. @Override public boolean hasStableIds() { return true; } // 设置父item组件 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_my_expandable_listview_parent, parent, false); // convertView = View.inflate(context, R.layout.question_expandable_parent, null);//这种方法字体样式没变 holder.parentTv = (TextView) convertView.findViewById(R.id.tv_myExpandableListView_item_parent); holder.parentImageViw = (ImageView) convertView.findViewById(R.id.iv_myExpandableListView_item_parent); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.parentTv.setText(mParentData.get(groupPosition)); // 判断isExpanded就可以控制是按下还是关闭,同时更换图片 if (isExpanded) { holder.parentImageViw.setBackgroundResource(R.drawable.ic_arrow_up); } else { holder.parentImageViw.setBackgroundResource(R.drawable.ic_arrow_down); } return convertView; } // 设置子item的组件 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { String key = mParentData.get(groupPosition); String info = mChildDataMap.get(key).get(childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.item_my_expandable_listview_children, parent, false); } TextView tv = (TextView) convertView.findViewById(R.id.tv_myExpandableListView_item_content); tv.setText(info); return convertView; } //而isChildSelectable(int groupPosition, int childPosition)用来判断某Group某个child是否可可选。 //我们可以添加条件控制某Group某个child可点或不可点击。当不加任何条件直接返回false,所有的组的child均不可点击。 @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } class ViewHolder { private TextView parentTv; private ImageView parentImageViw; } }MyExpandableListViewAdapter 中使用的两个布局: item_my_expandable_listview_parent.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_vertical"> <!--Android:lineSpacingMultiplier -设置行间距的倍数--> <TextView android:id="@+id/tv_myExpandableListView_item_parent" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:gravity="center_vertical" android:lineSpacingMultiplier="1.2" android:minHeight="50dp" android:paddingStart="10dp" android:textSize="14sp" /> <ImageView android:id="@+id/iv_myExpandableListView_item_parent" android:layout_width="20dp" android:layout_height="20dp" android:layout_alignParentEnd="true" android:layout_centerVertical="true" android:layout_marginEnd="20dp" /> </RelativeLayout>item_my_expandable_listview_children.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:gravity="center_vertical" android:orientation="vertical" > <TextView android:id="@+id/tv_myExpandableListView_item_content" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:gravity="center_vertical" android:lineSpacingMultiplier="1.2" android:minHeight="50dp" android:padding="10dp" android:textSize="12sp" /> </LinearLayout>源代码:https://gitee.com/hjqjl/WhDemo