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>