三級樹目錄:
下載地址:
先上圖:
實現:
activity_main:
<?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:orientation="vertical">
<ExpandableListView
android:id="@+id/expand_list_id"
android:layout_width="match_parent"
android:groupIndicator="@null"
android:layout_height="0dp"
android:layout_weight="1">
</ExpandableListView>
<!--<Button-->
<!--android:id="@+id/btn_Ok_Ry"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="40dp"-->
<!--android:text="確定"-->
<!--android:textColor="@color/white"-->
<!--android:background="@drawable/button_ry"-->
<!--android:layout_margin="10dp"/>-->
</LinearLayout>
MainActivity:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ExpandableListView;
import android.widget.Toast;
import com.google.gson.Gson;
import youli.com.example.administrator.threelevelmenu.adapter.ExpandableListviewAdapter;
import youli.com.example.administrator.threelevelmenu.info.Get_Personne;
public class MainActivity extends AppCompatActivity {
private ExpandableListView expand_list_id;
private Get_Personne get_personne;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
}
private void initview() {
Gson gson=new Gson();
//這裏是gson解析,數據可以自己添加
get_personne=gson.fromJson("{}",Get_Personne.class);
expand_list_id = findViewById(R.id.expand_list_id);
ExpandableListviewAdapter adapter = new ExpandableListviewAdapter(MainActivity.this, get_personne);
expand_list_id.setAdapter(adapter);
//默認展開第一個數組
// expand_list_id.expandGroup(0);
//關閉數組某個數組,可以通過該屬性來實現全部展開和只展開一個列表功能
//expand_list_id.collapseGroup(0);
expand_list_id.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView expandableListView, View view, int groupPosition, long l) {
// Toast.makeText(getActivity(),get_personne1.getSubName().get(groupPosition).getName(),Toast.LENGTH_SHORT).show();
// window.dismiss();
return false;
}
});
//子視圖的點擊事件
expand_list_id.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int groupPosition, int childPosition, long l) {
Toast.makeText(MainActivity.this, get_personne.getSubName().get(groupPosition).getSubName().get(childPosition).getSubName().get(childPosition).getName(), Toast.LENGTH_SHORT).show();
return true;
}
});
expand_list_id.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// Toast.makeText(getActivity(), get_personne1.getSubName().get(position).getSubName().get(position).getSubName().get(position).getName(), Toast.LENGTH_SHORT).show();
}
});
//用於當組項摺疊時的通知。
expand_list_id.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
@Override
public void onGroupCollapse(int groupPosition) {
Toast.makeText(MainActivity.this,"摺疊了數據"+get_personne.getSubName().get(groupPosition).getName(),Toast.LENGTH_LONG).show();
}
});
//用於當組項摺疊時的通知。
expand_list_id.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
Toast.makeText(MainActivity.this,"展開了數據"+get_personne.getSubName().get(groupPosition).getName(),Toast.LENGTH_LONG).show();
}
});
}
}
CustomExpandableListView:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ExpandableListView;
/**
* author:Created by LiangSJ
* date: 2020/6/15.
* description:解決,expandablelistview嵌套衝突問題
*/
public class CustomExpandableListView extends ExpandableListView {
public CustomExpandableListView(Context context) {
super(context);
}
public CustomExpandableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomExpandableListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomExpandableListView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 解決顯示不全的問題
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2
, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
ExpandableListviewAdapter:
import android.annotation.SuppressLint;
import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.text.TextUtils;
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 java.util.ArrayList;
import java.util.List;
import youli.com.example.administrator.threelevelmenu.R;
import youli.com.example.administrator.threelevelmenu.info.Get_Personne;
/**
* Created by Administrator on 2020/6/15.
*/
public class ExpandableListviewAdapter extends BaseExpandableListAdapter {
private Context context;
private Get_Personne get_personne;
public ExpandableListviewAdapter(Context context, Get_Personne get_personne) {
this.context = context;
this.get_personne = get_personne;
}
//獲取第一層組計數
@Override
public int getGroupCount() {
return get_personne.getSubName().size();
}
//獲取第二層子計數
@Override
public int getChildrenCount(int groupPosition) {
// 重點這裏改成1才顯示三層結構
return 1; //get_personne.getSubName().get(groupPosition).getSubName().size();
}
//獲取組
@Override
public Object getGroup(int groupPosition) {
return get_personne.getSubName().get(groupPosition);
}
//獲取子目錄
@Override
public Object getChild(int groupPosition, int childPosition) {
return get_personne.getSubName().get(groupPosition).getSubName().get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
//分組和子選項是否持有穩定的ID, 就是說底層數據的改變會不會影響到它們
public boolean hasStableIds() {
return true;
}
/**
* 獲取顯示指定組的視圖對象
*
* @param groupPosition 組位置
* @param isExpanded 該組是展開狀態還是伸縮狀態,true=展開
* @param convertView 重用已有的視圖對象
* @param parent 返回的視圖對象始終依附於的視圖組
*/
@SuppressLint("WrongViewCast")
@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.sanjicaidan_one_layout, parent, false);
groupViewHolder = new GroupViewHolder();
groupViewHolder.parent_textview_id = convertView.findViewById(R.id.parent_textview_id);
groupViewHolder.parent_image = convertView.findViewById(R.id.parent_image);
convertView.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.parent_textview_id.setText(get_personne.getSubName().get(groupPosition).getName());
// 如果是展開狀態
if (isExpanded) {
groupViewHolder.parent_image.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pwpjt2));
} else {
groupViewHolder.parent_image.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pwpjt1));
}
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
//如果要顯示二級樹目錄直接把線面註釋、然後添加需要展示的數據
CustomExpandableListView customExpandableListView = (CustomExpandableListView) convertView;
if (convertView == null) {
customExpandableListView = new CustomExpandableListView(context);
}
customExpandableListView.setGroupIndicator(null); //去掉默認箭頭
Get_Personne.SubNameBeanXX url = get_personne.getSubName().get(groupPosition);
SecondAdapter secondAdapter = new SecondAdapter(context, url.getSubName()); //Adapter
customExpandableListView.setAdapter(secondAdapter); //顯示二層、三層
return customExpandableListView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
class SecondAdapter extends BaseExpandableListAdapter {
//第二三層數據
private List<Get_Personne.SubNameBeanXX.SubNameBeanX> subxxList = new ArrayList<>();
private Context context;
public SecondAdapter(Context context, List<Get_Personne.SubNameBeanXX.SubNameBeanX> subxxList) {
this.subxxList = subxxList;
this.context = context;
}
@Override
public int getGroupCount() {
return subxxList.size();
}
@Override
public int getChildrenCount(int groupPosition) {
return subxxList.get(groupPosition).getSubName().size();
}
@Override
public Object getGroup(int groupPosition) {
return subxxList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return subxxList.get(groupPosition).getSubName().get(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) {
GroupViewHolder2 groupViewHolder2 = null;
if (convertView == null) {
groupViewHolder2 = new GroupViewHolder2();
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.snajicaidan_two_layout, parent, false);
groupViewHolder2.chidren_item = convertView.findViewById(R.id.chidren_item);
groupViewHolder2.parent_image2 = convertView.findViewById(R.id.parent_image2);
convertView.setTag(groupViewHolder2);
} else {
groupViewHolder2 = (GroupViewHolder2) convertView.getTag();
}
if (!TextUtils.equals(subxxList.get(groupPosition).getName(), "當前就業")) {
//如果是展開狀態
if (isExpanded) {
groupViewHolder2.parent_image2.setImageDrawable(ContextCompat.getDrawable(context,R.color.yr));
} else {
groupViewHolder2.parent_image2.setImageDrawable(ContextCompat.getDrawable(context,R.color.yr));
}
}
if (TextUtils.equals(subxxList.get(groupPosition).getName(), "當前就業")) {
//如果是展開狀態
if (isExpanded) {
groupViewHolder2.parent_image2.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pwpjt2));
} else {
groupViewHolder2.parent_image2.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.pwpjt1));
}
}
groupViewHolder2.chidren_item.setText(subxxList.get(groupPosition).getName());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
GroupViewHolder3 groupViewHolder3;
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.snajicaidan_three_layout, parent, false);
groupViewHolder3 = new GroupViewHolder3();
groupViewHolder3.chidren_item_iten = convertView.findViewById(R.id.chidren_item_iten);
convertView.setTag(groupViewHolder3);
} else {
groupViewHolder3 = (GroupViewHolder3) convertView.getTag();
}
groupViewHolder3.chidren_item_iten.setText(subxxList.get(groupPosition).getSubName().get(childPosition).getName());
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
static class GroupViewHolder {
TextView parent_textview_id;
ImageView parent_image;
}
static class GroupViewHolder2 {
TextView chidren_item;
ImageView parent_image2;
}
static class GroupViewHolder3 {
TextView chidren_item_iten;
}
}
重點是這個Adapter裏面,都有註釋
應爲使用gson解析的所以依賴也附上:
//gson解析
compile 'com.google.code.gson:gson:2.7'