最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android中RecyclerView實(shí)現(xiàn)多級(jí)列表展示效果

 更新時(shí)間:2026年01月20日 10:12:44   作者:aidou1314  
本文介紹了如何使用RecyclerView實(shí)現(xiàn)多級(jí)列表展示效果,通過(guò)點(diǎn)擊節(jié)點(diǎn)展開(kāi)或收起子節(jié)點(diǎn),每個(gè)子節(jié)點(diǎn)縮進(jìn)指定距離,文章附有完整的代碼示例,感興趣的朋友跟隨小編一起看看吧

需求:實(shí)現(xiàn)出多級(jí)列表展示效果,每一級(jí)可點(diǎn)擊,有子級(jí)展開(kāi)子級(jí)數(shù)據(jù),沒(méi)有子級(jí)響應(yīng)點(diǎn)擊事件

說(shuō)明:本文說(shuō)的RecyclerView實(shí)現(xiàn)多級(jí)列表只是效果呈現(xiàn)是多級(jí),實(shí)則是平行列表只有一級(jí),當(dāng)點(diǎn)擊節(jié)點(diǎn)有子節(jié)點(diǎn),則將子節(jié)點(diǎn)數(shù)據(jù)添加到該節(jié)點(diǎn)下邊,每個(gè)子節(jié)點(diǎn)縮進(jìn)指定距離(如下圖)

以下附完整代碼

build.gradle文件中引用RecyclerView

dependencies {
	implementation 'com.android.support:recyclerview-v7:+'
}

activity_main.xml

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

item_multi_level.xml

<?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="wrap_content"
    android:orientation="horizontal">
    <ImageView
        android:id="@+id/iv_arrow"
        android:visibility="gone"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_marginEnd="8dp"
         /><!--可添加自己所用展開(kāi)、收起圖片-->
    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:textColor="@android:color/black" />
</LinearLayout>

TreeNode.java

package com.example.recycler;
import java.util.ArrayList;
import java.util.List;
// TreeNode.java
public class TreeNode {
    private String id;
    private String name;
    private int level; // 層級(jí),0開(kāi)始
    private boolean isExpanded; // 是否展開(kāi)
    private TreeNode parent; // 父節(jié)點(diǎn)
    private List<TreeNode> children; // 子節(jié)點(diǎn)
    private Object data; // 其他數(shù)據(jù)
    public TreeNode(String id, String name,int level) {
        this.id = id;
        this.name = name;
        this.children = new ArrayList<>();
        this.isExpanded = false;
        this.level = level;
    }
    // Getters and Setters
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getLevel() { return level; }
    public void setLevel(int level) { this.level = level; }
    public boolean isExpanded() { return isExpanded; }
    public void setExpanded(boolean expanded) { isExpanded = expanded; }
    public TreeNode getParent() { return parent; }
    public void setParent(TreeNode parent) { this.parent = parent; }
    public List<TreeNode> getChildren() { return children; }
    public void setChildren(List<TreeNode> children) { this.children = children; }
    public Object getData() { return data; }
    public void setData(Object data) { this.data = data; }
    // 添加子節(jié)點(diǎn)
    public void addChild(TreeNode child) {
        child.setParent(this);
        child.setLevel(this.level + 1);
        children.add(child);
    }
    // 判斷是否有子節(jié)點(diǎn)
    public boolean hasChildren() {
        return children != null && !children.isEmpty();
    }
}

MultiLevelAdapter.java

package com.example.recycler;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MultiLevelAdapter extends RecyclerView.Adapter<MultiLevelAdapter.ViewHolder> {
    private List<TreeNode> displayNodes; // 實(shí)際顯示的數(shù)據(jù)
    private List<TreeNode> allNodes; // 所有數(shù)據(jù)
    private OnItemClickListener listener;
    public MultiLevelAdapter(List<TreeNode> data) {
        this.allNodes = data;
        this.displayNodes = getDisplayNodes(data);
    }
    // 獲取要顯示的節(jié)點(diǎn)(展開(kāi)的節(jié)點(diǎn))
    private List<TreeNode> getDisplayNodes(List<TreeNode> nodes) {
        List<TreeNode> result = new ArrayList<>();
        for (TreeNode node : nodes) {
            result.add(node);
            if (node.isExpanded() && node.hasChildren()) {
                result.addAll(getDisplayNodes(node.getChildren()));
            }
        }
        return result;
    }
    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_multi_level, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, int position) {
        TreeNode node = displayNodes.get(position);
        // 設(shè)置縮進(jìn)
        int paddingLeft = node.getLevel() * 50; // 每級(jí)縮進(jìn)50dp
        System.out.println("縮進(jìn):::"+paddingLeft);
        holder.itemView.setPadding(paddingLeft, 0, 0, 0);
        // 設(shè)置文本
        holder.textView.setText(node.getName());
        // 設(shè)置箭頭圖標(biāo)
        if (node.hasChildren()) {
            holder.arrowIcon.setVisibility(View.VISIBLE);
        } else {
            holder.arrowIcon.setVisibility(View.GONE);
        }
		if (node.isExpanded())
			//展開(kāi)圖片設(shè)置
			holder.arrowIcon.setBackground(你的圖片)
		else
			//收起圖片設(shè)置
			holder.arrowIcon.setBackground(你的圖片)
        // 點(diǎn)擊事件
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int adapterPosition = holder.getAdapterPosition();
                if (adapterPosition != RecyclerView.NO_POSITION) {
                    TreeNode clickedNode = displayNodes.get(adapterPosition);
                    if (clickedNode.hasChildren()) {
                        // 有子節(jié)點(diǎn):切換展開(kāi)/收起狀態(tài)
                        int removeCount = 0;
                        if (clickedNode.isExpanded()) {
                            removeCount = countAllChildren(clickedNode);
                            clearAllChildExpand(clickedNode);
                        }
                        clickedNode.setExpanded(!clickedNode.isExpanded());
                        refreshDisplayNodes();
						//int a = 收起圖片
                        if (clickedNode.isExpanded()) {
							a = 展開(kāi)圖片
                            notifyItemRangeInserted(adapterPosition + 1, clickedNode.getChildren().size());
                        }else if (!clickedNode.isExpanded()&&removeCount!=0){
                            notifyItemRangeRemoved(adapterPosition + 1, removeCount);
                        }
						holder.arrowIcon.setBackground(a)
                    } else {
                        // 沒(méi)有子節(jié)點(diǎn):觸發(fā)點(diǎn)擊事件
                        if (listener != null) {
                            listener.onItemClick(clickedNode);
                        }
                    }
                }
            }
        });
        // 長(zhǎng)按事件(可選)
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (listener != null) {
                    return listener.onItemLongClick(displayNodes.get(holder.getAdapterPosition()));
                }
                return false;
            }
        });
    }
    // 計(jì)算節(jié)點(diǎn)的所有子節(jié)點(diǎn)數(shù)量(包括子節(jié)點(diǎn)的子節(jié)點(diǎn))
    private int countAllChildren(TreeNode node) {
        int count = 0;
        if (node.hasChildren() && node.isExpanded()) {
            for (TreeNode child : node.getChildren()) {
                count++;
                if (child.isExpanded()) {
                    count += countAllChildren(child);
                }
            }
        }
        return count;
    }
    private void clearAllChildExpand(TreeNode node) {
        if (node.hasChildren()) {
            for (TreeNode child : node.getChildren()) {
                child.setExpanded(false);
                clearAllChildExpand(child);
            }
        }
    }
    // 刷新顯示的數(shù)據(jù)
    private void refreshDisplayNodes() {
        displayNodes = getDisplayNodes(allNodes);
    }
    @Override
    public int getItemCount() {
        return displayNodes.size();
    }
    // 設(shè)置數(shù)據(jù)
    public void setData(List<TreeNode> data) {
        this.allNodes = data;
        refreshDisplayNodes();
        notifyDataSetChanged();
    }
    // 展開(kāi)/收起所有節(jié)點(diǎn)
    public void expandAll() {
        setExpandedForAll(allNodes, true);
        refreshDisplayNodes();
        notifyDataSetChanged();
    }
    public void collapseAll() {
        setExpandedForAll(allNodes, false);
        refreshDisplayNodes();
        notifyDataSetChanged();
    }
    private void setExpandedForAll(List<TreeNode> nodes, boolean expanded) {
        for (TreeNode node : nodes) {
            node.setExpanded(expanded);
            if (node.hasChildren()) {
                setExpandedForAll(node.getChildren(), expanded);
            }
        }
    }
    // ViewHolder
    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;
        ImageView arrowIcon;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.tv_item_name);
            arrowIcon = itemView.findViewById(R.id.iv_arrow);
        }
    }
    // 點(diǎn)擊監(jiān)聽(tīng)接口
    public interface OnItemClickListener {
        void onItemClick(TreeNode node);
        boolean onItemLongClick(TreeNode node);
    }
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.listener = listener;
    }
}

MainActivity.java

package com.example.recycler;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
// MainActivity.java
public class MainActivity extends Activity {
    private RecyclerView recyclerView;
    private MultiLevelAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        // 創(chuàng)建測(cè)試數(shù)據(jù)
        List<TreeNode> data = createTestData();
        adapter = new MultiLevelAdapter(data);
        recyclerView.setAdapter(adapter);
        // 設(shè)置點(diǎn)擊監(jiān)聽(tīng)
        adapter.setOnItemClickListener(new MultiLevelAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(TreeNode node) {
                // 處理沒(méi)有子節(jié)點(diǎn)的點(diǎn)擊事件
                Toast.makeText(MainActivity.this,
                        "點(diǎn)擊了: " + node.getName(), Toast.LENGTH_SHORT).show();
                // 可以在這里處理業(yè)務(wù)邏輯
                handleLeafClick(node);
            }
            @Override
            public boolean onItemLongClick(TreeNode node) {
                // 長(zhǎng)按事件
                showOptionsDialog(node);
                return true;
            }
        });
    }
    // 創(chuàng)建測(cè)試數(shù)據(jù)(支持無(wú)限層級(jí))
    private List<TreeNode> createTestData() {
        List<TreeNode> rootNodes = new ArrayList<>();
        // 第1級(jí)
        for (int i = 1; i <= 3; i++) {
            TreeNode level1 = new TreeNode("1-" + i, "一級(jí)節(jié)點(diǎn) " + i,0);
            level1.setLevel(0);
            // 第2級(jí)
            for (int j = 1; j <= 2; j++) {
                TreeNode level2 = new TreeNode("2-" + i + "-" + j, "二級(jí)節(jié)點(diǎn) " + i + "-" + j,level1.getLevel());
                level1.addChild(level2);
                // 第3級(jí)
                for (int k = 1; k <= (i == 1 ? 3 : 0); k++) {
                    TreeNode level3 = new TreeNode("3-" + i + "-" + j + "-" + k,
                            "三級(jí)節(jié)點(diǎn) " + i + "-" + j + "-" + k,level2.getLevel());
                    level2.addChild(level3);
                    // 第4級(jí)(演示無(wú)限層級(jí))
                    if (i == 1 && j == 1) {
                        for (int l = 1; l <= 2; l++) {
                            TreeNode level4 = new TreeNode("4-" + i + "-" + j + "-" + k + "-" + l,
                                    "四級(jí)節(jié)點(diǎn) " + i + "-" + j + "-" + k + "-" + l,level3.getLevel());
                            level3.addChild(level4);
                        }
                    }
                }
            }
            rootNodes.add(level1);
        }
        return rootNodes;
    }
    // 處理葉子節(jié)點(diǎn)點(diǎn)擊
    private void handleLeafClick(TreeNode node) {
        // 這里實(shí)現(xiàn)你的業(yè)務(wù)邏輯
        Log.d("MultiLevel", "點(diǎn)擊了葉子節(jié)點(diǎn): " + node.getName());
    }
}

到此這篇關(guān)于Android中RecyclerView實(shí)現(xiàn)多級(jí)列表展示效果的文章就介紹到這了,更多相關(guān)Android RecyclerView多級(jí)列表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

镶黄旗| 舒城县| 天祝| 松江区| 新沂市| 察哈| 邹城市| 厦门市| 肥乡县| 登封市| 云梦县| 略阳县| 收藏| 射阳县| 民县| 雅安市| 南郑县| 翼城县| 安阳县| 新乡市| 普兰县| 伊通| 花莲县| 乌兰浩特市| 遂昌县| 龙海市| 开鲁县| 镇江市| 新巴尔虎右旗| 陆河县| 成武县| 黎川县| 桦甸市| 化隆| 南川市| 保德县| 宁蒗| 霍邱县| 搜索| 乐都县| 东乌珠穆沁旗|