使用 ExpandableListView 来实现 TreeView
创建一个 ExpandableListAdapter 来为其提供数据。以下演示了如何使用 ExpandableListView 来展示树形结构的数据:
首先,在布局文件中添加 ExpandableListView:
xml
<ExpandableListView
android:id="@+id/expandableListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
接下来,创建一个 ExpandableListAdapter 类来管理树形结构的数据:
java
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> groupList; // 父项数据
private Map<String, List<String>> childMap; // 子项数据
public MyExpandableListAdapter(Context context, List<String> groupList, Map<String, List<String>> childMap) {
this.context = context;
this.groupList = groupList;
this.childMap = childMap;
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return childMap.get(groupList.get(groupPosition)).get(childPosition);
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
}
TextView textView = convertView.findViewById(R.id.listItem);
textView.setText(childText);
return convertView;
}
@Override
public int getChildrenCount(int groupPosition) {
return childMap.get(groupList.get(groupPosition)).size();
}
@Override
public Object getGroup(int groupPosition) {
return groupList.get(groupPosition);
}
@Override
public int getGroupCount() {
return groupList.size();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
String groupText = (String) getGroup(groupPosition);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_group, null);
}
TextView textView = convertView.findViewById(R.id.listGroup);
textView.setText(groupText);
return convertView;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
在上述代码中,我们创建了一个自定义的 ExpandableListAdapter,用于管理父项和子项的数据展示。在 getChildView 和 getGroupView 方法中,我们根据数据来填充父项和子项的视图。
最后,在 Activity 或者 Fragment 中设置 ExpandableListView 的适配器并提供数据:
java
ExpandableListView expandableListView = findViewById(R.id.expandableListView);
MyExpandableListAdapter adapter = new MyExpandableListAdapter(getContext(), groupList, childMap); // groupList 和 childMap 是你的数据
expandableListView.setAdapter(adapter);
list_item为名称或名称+logo
如果你想在 ExpandableListView 中实现第一级为名称,第二级为名称+logo的效果,你可以修改 MyExpandableListAdapter 类的 getChildView 方法来实现这个需求。以下是一个简单的示例代码,展示了如何为第二级添加名称和 logo:
java
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
String childText = (String) getChild(groupPosition, childPosition);
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item, null);
}
TextView textView = convertView.findViewById(R.id.listItem);
ImageView imageView = convertView.findViewById(R.id.listLogo); // 假设你在布局文件中有一个 ImageView 用于显示 logo
textView.setText(childText);
// 设置对应的 logo
if (childText.equals("名称1")) {
imageView.setImageResource(R.drawable.logo1);
} else if (childText.equals("名称2")) {
imageView.setImageResource(R.drawable.logo2);
}
return convertView;
}
在上述代码中,我们修改了 getChildView 方法,为每个子项设置了对应的 logo。假设你在布局文件中有一个 ImageView 用于显示 logo,我们根据子项的名称来设置对应的 logo。
这样,当你设置 ExpandableListView 的适配器后,每个第二级子项将会显示名称和对应的 logo。
布局文件
以下是一个简单的布局文件示例,用于在 ExpandableListView 中展示第一级为名称,第二级为名称+logo的效果:
list_group.xml(用于展示第一级名称):
xml
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/listGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:textSize="20sp"
android:textColor="@android:color/black"/>
list_item.xml(用于展示第二级名称和logo):
xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/listItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="@android:color/black"/>
<ImageView
android:id="@+id/listLogo"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginStart="16dp"/>
</LinearLayout>