三級菜單 三級樹目錄

三級樹目錄:

下載地址:

先上圖:

實現:

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'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章