可以实现像qq好友分类一样的效果
首先当然是需要在主界面的布局里面放一个ExpandableListView,因为我放东西喜欢在可视化界面里直接拖进去然后再去xml里面修改,这里我发现可视化界面里找不到这个组件,没办法只能手写,而且ExpandableListView好像只能放在线性布局里面,需要手动把初始的约束布局改成线性
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ExpandableListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ExpandableListView>
</LinearLayout>
接下来再做两个布局,一个用来加载分类栏,也就是外层的布局,一个用来加载内容栏,也就是内层的布局
外层布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView"
android:layout_width="230dp"
android:layout_height="64dp"
android:layout_weight="0.5"
app:srcCompat="@mipmap/ic_launcher" />
<TextView
android:id="@+id/textView"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2
"
android:text="TextView" />
</LinearLayout>
内层布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView1"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_weight="0.5"
app:srcCompat="@mipmap/ic_launcher" />
<TextView
android:id="@+id/textView1"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="2
"
android:text="TextView" />
</LinearLayout>
这里可以根据个人喜好让两个布局位置调一下
接下来就是最重要的逻辑部分,和listview一样,我们也用自制的适配器来实现,
package com.example.expandblelistview;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ExpandableListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
listView.setAdapter(new MyExpandble());
/**
* 内层内容的点击事件
* 使用toast使他点击后显示内容
*/
listView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
Toast.makeText(MainActivity.this,strings[i][i1],Toast.LENGTH_SHORT).show();
return true;
}
});
}
private String[] groups = {"ss","dd","ff","ff"};
private String[][] strings = {{"ee","rr","tt"},{"gg","kk","ll"},{"77","88","22"},{"agd","asgr","ger"}};
/**
* 自制的ExpandbleList的适配器
*/
class MyExpandble extends BaseExpandableListAdapter {
@Override
//外层的长度
public int getGroupCount() {
return groups.length;
}
@Override
//内层的长度
public int getChildrenCount(int i) {
return strings[i].length;
}
@Override
//外层的内容
public Object getGroup(int i) {
return groups[i];
}
@Override
//内层的内容
public Object getChild(int i, int i1) {
return strings[i][i1];
}
@Override
//获得外层的id
public long getGroupId(int i) {
return i;
}
@Override
//获得内层的id
public long getChildId(int i, int i1) {
return i;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
//加载外层的布局
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
if (view == null){
view = getLayoutInflater().inflate(R.layout.group,null);
}
ImageView icon = view.findViewById(R.id.imageView);
TextView title = view.findViewById(R.id.textView);
title.setText(groups[i]);
return view;
}
@Override
//加载内层的布局
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
if (view == null){
view = getLayoutInflater().inflate(R.layout.child,null);
}
ImageView icon = view.findViewById(R.id.imageView1);
TextView title = view.findViewById(R.id.textView1);
title.setText(strings[i][i1]);
return view;
}
@Override
//内层是否能被选中
public boolean isChildSelectable(int i, int i1) {
return true;
}
}
}
最终效果就实现了,