Android の高度なマルチレベル リスト


ここに画像の説明を挿入
要件が発生した場合は、マルチレベルのリストを表示する必要があります。インターフェイスはタブレット上にあるため、 XML レイアウトで RecyclerView を 1 つずつ書いたのと同じように、レベルが左から右に配置されます。

ここに画像の説明を挿入
もちろん、あえてこのようにインターフェイスを書く前に最大レベルが指定されていることが前提ですが、2 つまたは 3 つのレベルしかないということが明確に規定されている場合は、もちろんそれが可能であれば問題はありませんいくらレベルがあってもこのように書くと

開発者としては、将来同じような要件が使用され、シリーズの数が固定されていない場合、このように書くと多くの欠陥があるはずなので、ホイールの作り方を考えて、ホイールに遭遇したときにそれを直接使用します。 「毎回インターフェイスを構築したり、ロジックを書いたりする必要はありません。もちろん、似たようなコードはインターネット上にありますが、自分のコードとは違う気がします。自分でセットを書いてみてはいかがでしょうか?」

以下はエフェクトの画像です。インターフェイスは少し見苦しいです。さまざまな効果を示すためだけに、美化に時間を費やすことはありませんでした。結局のところ、インターフェイスのスタイルはまだ多様であり、修正することはできません。

ここに画像の説明を挿入
ここに画像の説明を挿入
まず、どのように分類するかですが、当初はすべてのデータを入れて分析して分類することを考えていましたが、データによってはネットワークリクエストなど複雑な環境が必要な場合があります。

質問 1: 最初に採点したり、クリック後に段階的に表示されたりする問題を解決するにはどうすればよいですか?

回答: 独立してトリガーします。分析して単独で追加しないでください。追加するように指示してください。追加します。

質問 2: さまざまな条件で分類するにはどうすればよいですか?

回答: 独自のルールを定義する必要があります。これは完璧ではないかもしれませんが、後から自分で追加することはできます。そうしないと、ハードコードされたネットワーク リクエストや部分的なネットワーク リクエストがあるかどうかを完全に判断できなくなり、データ構造が異なる可能性もあります。パラメータ名が異なるため、データを個別に分類して追加する必要があります

アイデア:

1. 最初に、レベルの最大数と各レベルのスタイル (幅、背景など) を渡し、対応するレベルのリストを動的に作成し、アダプターとともに保存します (閉じるときに破棄することを忘れないでください)これにより、クリックするたびにリストが再作成され、クリックするたびに対応するデータのみが表示、非表示、置換されるという状況がなくなります。

2. 最初のレベルを作成する必要がある場合、最初のレベルのデータをフィルターで除外し、手順 1 で保存した最初のレベルのアダプターを取り出してデータを接続します。

3. 最初からすべての第 1 レベルの関連情報を表示したい場合は、データに基づいて対応する次のレベルをフィルタリングし、それを詰め続けるだけです。

4. クリック後に表示したい場合は、3番目の手順と同様に、クリック後にフィルタリングしてデータを入力します。

5. クリックした後、下のすべてのレベルを非表示にしてから、対応するレベルを表示したいのですが、そうしないと、すでに 3 番目のレベルに表示されているように見えます。このとき、他のレベルをクリックすると、3 番目のレベルは表示されません。ポールですが、前回の第 3 レベルのポールはまだ残っています

6. スタイルの問題。ニーズが異なればスタイルも異なります。これについては何もできません。スタイルは自分で変更することしかできませんが、最も基本的な幅、間隔、背景、各エントリのフォント サイズと高さは必要です。一律に指定できる

実装:

まず、使用するスリーパーティの依存関係をインポートします。

 implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'

アダプタ内のエンティティクラスは状況に応じて変更する必要があります

1. マルチレベルのリストを作成します。

XML レイアウトのメイン レイアウトは制約レイアウトを使用して、
Util のさまざまな階層スタイルを作成する必要があります。

        //这个集合存储的是每一层级的样式以及信息,会根据该集合的长度去创建最大多少级
        val mList: ArrayList<GetListUtils.GetListData> = arrayListOf()
        //第一级样式
        mList.add(GetListUtils.GetListData(width = 200,itemSize = 16f,itemHeight = 160, bGround = "#CC00FFFF"))
        //第二级样式
        mList.add(GetListUtils.GetListData(itemSize = 14f,itemHeight = 140,leftMargin = 60, bDrawable = getDrawable(R.mipmap.ic_launcher)))
        //第三极样式
        mList.add(GetListUtils.GetListData(width = 180,itemSize = 12f,itemHeight = 120,leftMargin = 80,bGround = "#CC33ff00"))
        //第四级样式
        mList.add(GetListUtils.GetListData(itemSize = 10f,itemHeight = 100,leftMargin = 30,bGround = "#CCFFFF33"))
        //第五级样式
        mList.add(GetListUtils.GetListData(itemSize = 8f,itemHeight = 80,leftMargin = 70))

        //这里是布局里的主布局,要用约束布局!!!
        val clAll = findViewById<ConstraintLayout>(R.id.cl_all)
        //层级列表和主布局传进去
        GetListUtils.find(clAll,context = this,mList)

2.自分で分類し、対応するレベルにデータを詰め込みます。ここでは、最初のレベルのデータをフィルタリングして、データを最初のレベルに送信します

ここでシミュレートされたデータ セットは、プロジェクト内の実際のデータ クラス (TestData) に置き換える必要があります。

        //模拟数据 type当前类型 parentType 父级,默认parentType = 0 为一级
        val mListAll: ArrayList<GetListUtils.TestData> = arrayListOf()

        mListAll.add(GetListUtils.TestData(name = "美食",type = 1, parentType = 0))
        mListAll.add(GetListUtils.TestData("饮品",2,0))

        mListAll.add(GetListUtils.TestData("西瓜",3,1))
        mListAll.add(GetListUtils.TestData("火龙果",4,1))
        mListAll.add(GetListUtils.TestData("葡萄",5,1))
        mListAll.add(GetListUtils.TestData("橘子",6,1))
        mListAll.add(GetListUtils.TestData("可乐",7,2))
        mListAll.add(GetListUtils.TestData("雪碧",8,2))
        mListAll.add(GetListUtils.TestData("美年达",9,2))

        mListAll.add(GetListUtils.TestData("西瓜汁",10,3))
        mListAll.add(GetListUtils.TestData("冰镇西瓜",11,3))
        mListAll.add(GetListUtils.TestData("火龙果块",12,4))
        mListAll.add(GetListUtils.TestData("冰葡萄",13,5))
        mListAll.add(GetListUtils.TestData("橘子汁",14,6))
        mListAll.add(GetListUtils.TestData("无糖可乐",15,7))
        mListAll.add(GetListUtils.TestData("满糖可乐",16,7))

        mListAll.add(GetListUtils.TestData("西瓜皮",17,11))
        mListAll.add(GetListUtils.TestData("西瓜籽",18,11))
        mListAll.add(GetListUtils.TestData("西瓜瓤",19,11))
        mListAll.add(GetListUtils.TestData("火龙果籽",20,12))
        mListAll.add(GetListUtils.TestData("橘子皮",21,14))
        mListAll.add(GetListUtils.TestData("橘子核",22,14))

        mListAll.add(GetListUtils.TestData("西瓜子",23,18))


        //筛选一级目录
        val mList1: ArrayList<GetListUtils.TestData> = arrayListOf()
        mListAll.forEach {
    
    
            if (it.parentType == 0){
    
    
                mList1.add(it)
            }
        }
        //设置一级目录
        GetListUtils.setListData(1,mList1,object :GetListUtils.OnListener{
    
    
            override fun onClick(l: GetListUtils.TestData) {
    
    
                

            }
        })

対応するレベルがデフォルトで表示されます。必要なのは、フィルター処理を続けてデータを接続し続けることだけです。

        //筛选二级目录
        val mList2: ArrayList<GetListUtils.TestData> = arrayListOf()
        mListAll.forEach {
    
    
            if (it.parentType == 1){
    
    
                mList1.add(it)
            }
        }
        GetListUtils.setListData(2,mList2,object :GetListUtils.OnListener{
    
    
            override fun onClick(l: GetListUtils.TestData) {
    
    
            }

        })

上記は使用方法、setListData(現在のレベル、レベルデータ、クリックイベントコールバック)です。

以下のコードはすべて参考用です

GetListUtils (Java)
/**
 * 动态添加集合
 * */
public class GetListUtils {
    
    

    private static ArrayList<RecyclerView> mRVList = new ArrayList<>();
    private static ArrayList<QnZtListAdapter> mAdapterList = new ArrayList<>();
    private static ConstraintLayout mParentView = null;

    public static void find(ConstraintLayout view, //父控件
                            Context context, //上下文
                            ArrayList<GetListData> gradle //几级
    ){
    
    
        clearList();
        mParentView = view;
        for (int i = 0;  i < gradle.size(); i++){
    
    
            GetListData mGradle = gradle.get(i);
            RecyclerView mRecyclerView = new RecyclerView(context);
            mRecyclerView.setId(View.generateViewId());
            mRVList.add(mRecyclerView);
            ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(
                    mGradle.getWidth(),
                    ViewGroup.LayoutParams.MATCH_PARENT
            );
            if (i == 0){
    
    
                layoutParams.startToStart = view.getId();
                layoutParams.topToTop = view.getId();

                if (mGradle.leftMargin != 0){
    
    
                    layoutParams.leftMargin = mGradle.leftMargin;
                }
            }else{
    
    
                layoutParams.startToEnd = mRVList.get(i-1).getId();
                layoutParams.topToTop = mRVList.get(i-1).getId();

                if (mGradle.leftMargin != 0){
    
    
                    layoutParams.leftMargin = mGradle.leftMargin;
                }
            }
            //背景图优先级高
            if (mGradle.getbDrawable() != null){
    
    
                mRecyclerView.setBackground(mGradle.getbDrawable());
            }else{
    
    
                if (!Objects.equals(mGradle.getbGround(), "")){
    
    
                    mRecyclerView.setBackgroundColor(Color.parseColor(mGradle.getbGround()));
                }
            }
            mRecyclerView.setLayoutParams(layoutParams);
            mRecyclerView.setLayoutManager(new LinearLayoutManager(context));
            mRecyclerView.setItemAnimator(new DefaultItemAnimator());

            QnZtListAdapter mAdapter = new QnZtListAdapter(R.layout.item_get_list,null,gradle.get(i));
            mRecyclerView.setAdapter(mAdapter);
            mAdapterList.add(mAdapter);
            view.addView(mRecyclerView);
        }
    }

    //设置数据
    public static void setListData(int i, ArrayList<TestData> l,OnListener k){
    
    
        if (l.size() > 0){
    
    
            Log.e(TAG, "setListData--->: 这是栏目");
            QnZtListAdapter a = getAdapter(i);
            if (a != null){
    
    
                a.setList(l);
                a.setOnItemClickListener(new OnItemClickListener() {
    
    
                    @Override
                    public void onItemClick(@NonNull BaseQuickAdapter<?, ?> adapter, @NonNull View view, int position) {
    
    
                        //点击当前层级,隐藏下一层级
                        for (int j = 0; j < mRVList.size(); j++){
    
    
                            //这里减一是因为点击的时候是i点击的当前级数,要从下一级开始
                            if (j > i-1){
    
    
                                mRVList.get(j).setVisibility(View.GONE);
                            }
                        }
                        //这里加一是因为i是当前级数,要从下一级开始
                        //下标从零开始为什么还要加一呢?因为获取列表里面减一了
                        if (getList(i+1) != null){
    
    
                            getList(i+1).setVisibility(View.VISIBLE);
                        }
                        ArrayList<TestData> mData = (ArrayList<TestData>) adapter.getData();
                        //回调
                        k.onClick(mData.get(position));
                        //更新选中状态
                        for (TestData t: mData){
    
    
                            t.select = false;
                        }
                        mData.get(position).select = true;
                        adapter.notifyDataSetChanged();
                    }
                });
            }
        }else {
    
    
            Log.e(TAG, "setListData--->: 这是内容");
            if (getList(i) != null){
    
    
                getList(i).setVisibility(View.GONE);
            }
        }

    }

    //获取对应层级的列表
    private static RecyclerView getList(int i){
    
    
        RecyclerView mL = null;
        if ((mRVList.size() > 0) && (i-1) < mRVList.size()){
    
    
            try {
    
    
                mL = mRVList.get(i - 1);
            }catch (java.lang.Exception e){
    
    
                e.printStackTrace();
            }
        }
        return mL;
    }

    //获取对应层级的适配器
    private static QnZtListAdapter getAdapter(int i){
    
    
        QnZtListAdapter mAdapter = null;
        if ((mAdapterList.size() > 0) && (i-1) < mAdapterList.size()){
    
    
            try {
    
    
                mAdapter = mAdapterList.get(i - 1);
            }catch (java.lang.Exception e){
    
    
                e.printStackTrace();
            }
        }
        return mAdapter;
    }

    //置空操作
    public static void clearList(){
    
    
        mRVList.clear();
        mAdapterList.clear();
        if (mParentView != null){
    
    
            mParentView.removeAllViews();
        }
    }

    public interface OnListener {
    
    
        void onClick(TestData l);
    }

    //需要的数据类
    public static class GetListData{
    
    
            int width  = ViewGroup.LayoutParams.WRAP_CONTENT; //宽度
            int leftMargin = 0; //左间距
            String bGround = ""; //背景颜色
            Drawable bDrawable = null; //背景图片
            Float itemSize = 0f; //条目字体大小
            int itemHeight = ViewGroup.LayoutParams.WRAP_CONTENT; //条目字体高度

        public int getWidth() {
    
    
            return width;
        }

        public void setWidth(int width) {
    
    
            this.width = width;
        }

        public int getLeftMargin() {
    
    
            return leftMargin;
        }

        public void setLeftMargin(int leftMargin) {
    
    
            this.leftMargin = leftMargin;
        }

        public String getbGround() {
    
    
            return bGround;
        }

        public void setbGround(String bGround) {
    
    
            this.bGround = bGround;
        }

        public Drawable getbDrawable() {
    
    
            return bDrawable;
        }

        public void setbDrawable(Drawable bDrawable) {
    
    
            this.bDrawable = bDrawable;
        }

        public Float getItemSize() {
    
    
            return itemSize;
        }

        public void setItemSize(Float itemSize) {
    
    
            this.itemSize = itemSize;
        }

        public int getItemHeight() {
    
    
            return itemHeight;
        }

        public void setItemHeight(int itemHeight) {
    
    
            this.itemHeight = itemHeight;
        }
    }

    //模拟数据
    public static class TestData {
    
    
        String Name = ""; //名称
        int Tag = 0; //分类
        int ParentTag = 0; //父类
        boolean select  = false; //是否选中

        public String getName() {
    
    
            return Name;
        }

        public void setName(String name) {
    
    
            Name = name;
        }

        public int getTag() {
    
    
            return Tag;
        }

        public void setTag(int tag) {
    
    
            Tag = tag;
        }

        public int getParentTag() {
    
    
            return ParentTag;
        }

        public void setParentTag(int parentTag) {
    
    
            ParentTag = parentTag;
        }

        public boolean isSelect() {
    
    
            return select;
        }

        public void setSelect(boolean select) {
    
    
            this.select = select;
        }
    }


    static class QnZtListAdapter extends BaseQuickAdapter<TestData, BaseViewHolder> {
    
    

        private GetListUtils.GetListData gradle = null;


        public QnZtListAdapter(int layoutResId, List<TestData> data,GetListData gradle) {
    
    
            super(layoutResId, data);
            this.gradle = gradle;
        }


        @Override
        protected void convert(@NonNull BaseViewHolder helper, TestData item) {
    
    
            //总布局
            ConstraintLayout clGetList = helper.getView(R.id.cl_get_list);
            //第一条不显示分割线
            if (getItemPosition(item) == 0){
    
    
                helper.setGone(R.id.view_line,true);
            }

            TextView tvGetTxt = helper.getView(R.id.tv_get_txt);
            tvGetTxt.setText(item.Name);

            //选中资源
            Drawable selectRes = App.getInstance().getApplicationContext().getResources().getDrawable(R.drawable.icon_zt_yes);
            Drawable mDrawable = null;
            if (item.select){
    
    
                tvGetTxt.setTextColor(Color.parseColor("#FFFFFF"));
                mDrawable = selectRes;
            }else{
    
    
                tvGetTxt.setTextColor(Color.parseColor("#00E7F7"));
            }
            clGetList.setBackground(mDrawable);

            if (gradle != null){
    
    
                //界面高度
                if (gradle.itemHeight != 0){
    
    
                    ViewGroup.LayoutParams lp = clGetList.getLayoutParams();
                    lp.height = gradle.itemHeight;
                    clGetList.setLayoutParams(lp);
                }
                //字体大小
                if (gradle.getItemSize() != 0f){
    
    
                    tvGetTxt.setTextSize(gradle.getItemSize());
                }

            }
        }

    }
}

GetListUtils (Kotlin)
/**
 * 动态添加集合
 * */
object GetListUtils {
    
    

    private val mRVList: ArrayList<RecyclerView> = arrayListOf()
    private val mAdapterList: ArrayList<QnZtListAdapter> = arrayListOf()
    private var mParentView: ConstraintLayout? = null

    fun find(view: ConstraintLayout, //父控件
             context: Context, //上下文
             gradle: ArrayList<GetListData>, //几级
    ){
    
    
        clearList()
        mParentView = view
        for (i in 0 until gradle.size){
    
    
            val mGradle = gradle[i]
            val mRecyclerView = RecyclerView(context)
            mRecyclerView.id = View.generateViewId()
            mRVList.add(mRecyclerView)
            val layoutParams = ConstraintLayout.LayoutParams(
                mGradle.width,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
            if (i == 0){
    
    
                layoutParams.startToStart = view.id
                layoutParams.topToTop = view.id

                if (mGradle.leftMargin != 0){
    
    
                    layoutParams.leftMargin = mGradle.leftMargin
                }
            }else{
    
    
                layoutParams.startToEnd = mRVList[i-1].id
                layoutParams.topToTop = mRVList[i-1].id

                if (mGradle.leftMargin != 0){
    
    
                    layoutParams.leftMargin = mGradle.leftMargin
                }
            }
            //背景图优先级高
            if (mGradle.bDrawable != null){
    
    
                mRecyclerView.background = mGradle.bDrawable
            }else{
    
    
                if (mGradle.bGround.isNotEmpty()){
    
    
                    mRecyclerView.setBackgroundColor(Color.parseColor(mGradle.bGround))
                }
            }
            mRecyclerView.layoutParams = layoutParams
            mRecyclerView.layoutManager = LinearLayoutManager(context)
            mRecyclerView.itemAnimator = DefaultItemAnimator()

            val mAdapter = QnZtListAdapter(R.layout.item_get_list,mGradle)
            mRecyclerView.adapter = mAdapter
            mAdapterList.add(mAdapter)
            view.addView(mRecyclerView)
        }
    }

    //设置数据
    fun setListData(i: Int, l: ArrayList<TestData>,k: OnListener){
    
    
        if (l.isNotEmpty()){
    
    
            val a = getAdapter(i)
            if (a != null){
    
    
                a.setList(l)
                a.setOnItemClickListener {
    
     adapter, view, position ->
                    //点击当前层级,隐藏下一层级
                    for (j in 0 until mRVList.size){
    
    
                        //这里减一是因为点击的时候是i点击的当前级数,要从下一级开始
                        if (j > i-1){
    
    
                            mRVList[j].visibility = View.GONE
                        }
                    }
                    //这里加一是因为i是当前级数,要从下一级开始
                    //下标从零开始为什么还要加一呢?因为获取列表里面减一了
                    if (getList(i+1) != null){
    
    
                        getList(i+1)!!.visibility = View.VISIBLE
                    }
                    val mData = adapter.data as ArrayList<TestData>
                    //回调
                    k.onClick(mData[position])
                    //更新选中状态
                    mData.forEach {
    
    
                        it.select = false
                    }
                    mData[position].select = true
                    adapter.notifyDataSetChanged()
                }
            }
        }else{
    
    
            if (getList(i) != null){
    
    
                getList(i)!!.visibility = View.GONE
            }
        }
    }

    //获取对应层级的列表
    private fun getList(i: Int): RecyclerView?{
    
    
        var mL: RecyclerView? = null
        if (mRVList.isNotEmpty() && i-1 < mRVList.size){
    
    
            try {
    
    
                mL = mRVList[i - 1]
            }catch (e: java.lang.Exception){
    
    
                e.printStackTrace()
            }
        }
        return mL
    }

    //获取对应层级的适配器
    private fun getAdapter(i: Int): QnZtListAdapter?{
    
    
        var mAdapter: QnZtListAdapter? = null
        if (mAdapterList.isNotEmpty() && i-1 < mAdapterList.size){
    
    
            try {
    
    
                mAdapter = mAdapterList[i - 1]
            }catch (e: java.lang.Exception){
    
    
                e.printStackTrace()
            }
        }
        return mAdapter
    }

    //置空操作
    fun clearList(){
    
    
        mRVList.clear()
        mAdapterList.clear()
        if (mParentView != null){
    
    
            mParentView!!.removeAllViews()
        }
    }

    interface OnListener {
    
    
        fun onClick(l: TestData)
    }

    //需要的数据类
    data class GetListData(
        var width: Int = ViewGroup.LayoutParams.WRAP_CONTENT, //宽度
        var leftMargin: Int = 0, //左间距
        var bGround: String = "", //背景颜色
        var bDrawable: Drawable? = null, //背景图片
        var itemSize: Float = 0f, //条目字体大小
        var itemHeight: Int = ViewGroup.LayoutParams.WRAP_CONTENT, //条目字体高度
    ):java.io.Serializable

    //模拟数据
    data class TestData(
        var name: String? = "", //名称
        var type: Int? = 0, //分类
        var parentType: Int? = 0, //父类
        var select: Boolean = false //是否选中
    ):java.io.Serializable


    class QnZtListAdapter : BaseQuickAdapter<GetListUtils.TestData, BaseViewHolder> {
    
    

        constructor(layoutResId: Int) : super(layoutResId) {
    
    }

        private var gradle: GetListUtils.GetListData? = null

        constructor(layoutResId: Int, data: GetListUtils.GetListData) : super(layoutResId) {
    
    
            this.gradle = data
        }

        override fun convert(helper: BaseViewHolder, item: GetListUtils.TestData) {
    
    
            //总布局
            val clGetList = helper.getView<ConstraintLayout>(R.id.cl_get_list)
            //第一条不显示分割线
            if (helper.adapterPosition == 0){
    
    
                helper.setGone(R.id.view_line,true)
            }

            val tvGetTxt = helper.getView<TextView>(R.id.tv_get_txt)
            tvGetTxt.text = item.name

            if (item.select){
    
    
                tvGetTxt.setTextColor(Color.RED)
            }else{
    
    
                tvGetTxt.setTextColor(Color.GRAY)
            }

            if (gradle != null){
    
    
                //界面高度
                if (gradle!!.itemHeight != 0){
    
    
                    val lp: ViewGroup.LayoutParams = clGetList.layoutParams
                    lp.height = gradle!!.itemHeight
                    clGetList.layoutParams = lp
                }
                //字体大小
                if (gradle!!.itemSize != 0f){
    
    
                    tvGetTxt.textSize = gradle!!.itemSize
                }

            }
        }

    }
}
アイテム取得リスト
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/cl_get_list"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <View
        android:id="@+id/view_line"
        android:layout_width="0dp"
        android:layout_height="1px"
        android:background="#CC666666"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/tv_get_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:text = "哈哈哈"/>

</androidx.constraintlayout.widget.ConstraintLayout>
リストアクティビティの追加
/**
 * 动态创建多级列表*/
class AddListActivity : AppCompatActivity() {
    
    
    override fun onCreate(savedInstanceState: Bundle?) {
    
    
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_list)

        //这个集合存储的是每一层级的样式以及信息,会根据该集合的长度去创建最大多少级
        val mList: ArrayList<GetListUtils.GetListData> = arrayListOf()
        //第一级样式
        mList.add(GetListUtils.GetListData(width = 200,itemSize = 16f,itemHeight = 160, bGround = "#CC00FFFF"))
        //第二级样式
        mList.add(GetListUtils.GetListData(itemSize = 14f,itemHeight = 140,leftMargin = 60, bDrawable = getDrawable(R.mipmap.ic_launcher)))
        //第三极样式
        mList.add(GetListUtils.GetListData(width = 180,itemSize = 12f,itemHeight = 120,leftMargin = 80,bGround = "#CC33ff00"))
        //第四级样式
        mList.add(GetListUtils.GetListData(itemSize = 10f,itemHeight = 100,leftMargin = 30,bGround = "#CCFFFF33"))
        //第五级样式
        mList.add(GetListUtils.GetListData(itemSize = 8f,itemHeight = 80,leftMargin = 70))

        //这里是布局里的主布局,要用约束布局!!!
        val clAll = findViewById<ConstraintLayout>(R.id.cl_all)
        //层级列表和主布局传进去
        GetListUtils.find(clAll,context = this,mList)

        //模拟数据 type当前类型 parentType 父级,默认parentType = 0 为一级
        val mListAll: ArrayList<GetListUtils.TestData> = arrayListOf()

        mListAll.add(GetListUtils.TestData(name = "美食",type = 1, parentType = 0))
        mListAll.add(GetListUtils.TestData("饮品",2,0))

        mListAll.add(GetListUtils.TestData("西瓜",3,1))
        mListAll.add(GetListUtils.TestData("火龙果",4,1))
        mListAll.add(GetListUtils.TestData("葡萄",5,1))
        mListAll.add(GetListUtils.TestData("橘子",6,1))
        mListAll.add(GetListUtils.TestData("可乐",7,2))
        mListAll.add(GetListUtils.TestData("雪碧",8,2))
        mListAll.add(GetListUtils.TestData("美年达",9,2))

        mListAll.add(GetListUtils.TestData("西瓜汁",10,3))
        mListAll.add(GetListUtils.TestData("冰镇西瓜",11,3))
        mListAll.add(GetListUtils.TestData("火龙果块",12,4))
        mListAll.add(GetListUtils.TestData("冰葡萄",13,5))
        mListAll.add(GetListUtils.TestData("橘子汁",14,6))
        mListAll.add(GetListUtils.TestData("无糖可乐",15,7))
        mListAll.add(GetListUtils.TestData("满糖可乐",16,7))

        mListAll.add(GetListUtils.TestData("西瓜皮",17,11))
        mListAll.add(GetListUtils.TestData("西瓜籽",18,11))
        mListAll.add(GetListUtils.TestData("西瓜瓤",19,11))
        mListAll.add(GetListUtils.TestData("火龙果籽",20,12))
        mListAll.add(GetListUtils.TestData("橘子皮",21,14))
        mListAll.add(GetListUtils.TestData("橘子核",22,14))

        mListAll.add(GetListUtils.TestData("西瓜子",23,18))


        //筛选一级目录
        val mList1: ArrayList<GetListUtils.TestData> = arrayListOf()
        mListAll.forEach {
    
    
            if (it.parentType == 0){
    
    
                mList1.add(it)
            }
        }
        //设置一级目录
        GetListUtils.setListData(1,mList1,object :GetListUtils.OnListener{
    
    
            override fun onClick(l: GetListUtils.TestData) {
    
    
                //点击一级目录后筛选二级
                val mList2: ArrayList<GetListUtils.TestData> = arrayListOf()
                mListAll.forEach {
    
    
                    //还原选中状态,如果默认选中第一个用for循环去设置
                    it.select = false
                    if (l.type == it.parentType){
    
    
                        mList2.add(it)
                    }
                }
                //设置二级目录
                GetListUtils.setListData(2,mList2,object :GetListUtils.OnListener{
    
    
                    override fun onClick(l: GetListUtils.TestData) {
    
    
                        //点击二级目录后筛选三级
                        val mList3: ArrayList<GetListUtils.TestData> = arrayListOf()
                        mListAll.forEach {
    
    
                            //还原选中状态,如果默认选中第一个用for循环去设置
                            it.select = false
                            if (l.type == it.parentType){
    
    
                                mList3.add(it)
                            }
                        }
                        //设置三级目录
                        GetListUtils.setListData(3,mList3,object :GetListUtils.OnListener{
    
    
                            override fun onClick(l: GetListUtils.TestData) {
    
    
                                //点击三级目录筛选四级目录
                                val mList4: ArrayList<GetListUtils.TestData> = arrayListOf()
                                mListAll.forEach {
    
    
                                    //还原选中状态,如果默认选中第一个用for循环去设置
                                    it.select = false
                                    if (l.type == it.parentType){
    
    
                                        mList4.add(it)
                                    }
                                }
                                //设置四级目录
                                GetListUtils.setListData(4,mList4,object :GetListUtils.OnListener{
    
    
                                    override fun onClick(l: GetListUtils.TestData) {
    
    
                                        //点击四级目录筛选五级目录
                                        val mList5: ArrayList<GetListUtils.TestData> = arrayListOf()
                                        mListAll.forEach {
    
    
                                            //还原选中状态,如果默认选中第一个用for循环去设置
                                            it.select = false
                                            if (l.type == it.parentType){
    
    
                                                mList5.add(it)
                                            }
                                        }
                                        GetListUtils.setListData(5,mList5,object :GetListUtils.OnListener{
    
    
                                            override fun onClick(l: GetListUtils.TestData) {
    
    
                                                Toast.makeText(this@AddListActivity,l.name,Toast.LENGTH_SHORT).show()
                                            }
                                        })
                                    }
                                })
                            }
                        })
                    }
                })

            }
        })

    }

    override fun onDestroy() {
    
    
        super.onDestroy()
        GetListUtils.clearList()
    }
}
アクティビティ追加リスト
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    android:id="@+id/cl_all"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".AddListActivity">

</androidx.constraintlayout.widget.ConstraintLayout>

セルフテストの効果は基本的に満足です~対応するTestDataを修正して一元的に処理できるか確認するのが面倒です

おすすめ

転載: blog.csdn.net/As_thin/article/details/132300617