安卓 三级菜单 三级树目录

三级树目录:

下载地址:https://download.csdn.net/download/hdhhd/12527325

先上图:

下载打开即可直接使用:只需要在gson.fromJson("  ",Get_Personne.class);这里添加自己的json数据即可,然后传给adapter


        //数据可以自己添加
        get_personne=gson.fromJson("{}",Get_Personne.class);

     
        ExpandableListviewAdapter adapter = new ExpandableListviewAdapter(MainActivity.this, get_personne);

实现:

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  implements ExpandableListviewAdapter.OnRvItemClickListener{

    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);



     ExpandableListviewAdapter adapter;
        expand_list_id = findViewById(R.id.expand_list_id);
        adapter = new ExpandableListviewAdapter(MainActivity.this,get_personne);
        adapter.setOnRvItemClickListener(this);  //点击事件
        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();
            }
        });
    }


  //二三层点击事件
    @Override
    public void OnItemClick(int position, int position1) {
        String values = get_personne.getSubName().get(position).getSubName().get(position1).getName();
        Toast.makeText(MainActivity.this,values+"",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void OnOptionClick(int position, int position1, int position2) {
        String values = get_personne.getSubName().get(position).getSubName().get(position1).getSubName().get(position2).getName();
        Toast.makeText(MainActivity.this,values+"",Toast.LENGTH_SHORT).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;
    }


//设置二三层点击事件接口
 private OnRvItemClickListener onRvItemClickListener;

    public interface OnRvItemClickListener {
        void OnItemClick(int position,int position1);

        void OnOptionClick(int position,int position1,int position2);
    }

    public void setOnRvItemClickListener(OnRvItemClickListener onRvItemClickListener) {
        this.onRvItemClickListener = onRvItemClickListener;
    }


    //获取第一层组计数
    @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);  //显示二层、三层

   //点击事件
        customExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int childPosition, long id) {

                if (onRvItemClickListener != null) {
                    onRvItemClickListener.OnItemClick(groupPosition,childPosition);
                }

                return false;
            }
        });


    customExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

                if (onRvItemClickListener != null) {
                    onRvItemClickListener.OnOptionClick(groupPosition,groupPosition,childPosition);
                }

                return false;
            }
        });

        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'

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值