温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android RecycleView如何实现多级树形列表

发布时间:2021-05-31 12:36:02 来源:亿速云 阅读:524 作者:小新 栏目:开发技术

这篇文章给大家分享的是有关android RecycleView如何实现多级树形列表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

本文实例为大家分享了android RecycleView实现多级树形列表的具体代码,供大家参考,具体内容如下

实现多级树状列表:

1. Node.java

public class Node<T, B> implements Serializable {     /**      * 传入的实体对象      */     public B bean;     /**      * 设置开启的图片      */     public int iconExpand = -1;     /**      * 设置关闭的图片      */     public int iconNoExpand = -1;       private T id;     /**      * 根节点pId为0      */     private T pId;       private String name;       /**      * 当前的级别      */     private int level;       /**      * 是否展开      */     private boolean isExpand = false;       private int icon = -1;       /**      * 下一级的子Node      */     private List<Node> children = new ArrayList<>();       /**      * 父Node      */     private Node parent;     /**      * 是否被checked选中      */     private boolean isChecked;     /**      * 是否为新添加的      */     public boolean isNewAdd = true;     /**      * 单选标记      */     public boolean isSingle;       /**      * 支部code      */     public String braCode;       public Node(T id, T pId, String name) {         super();         this.id = id;         this.pId = pId;         this.name = name;     }       public Node(T id, T pId, String name, B bean) {         super();         this.id = id;         this.pId = pId;         this.name = name;         this.bean = bean;     }       public String getBraCode() {         return braCode;     }       public void setBraCode(String braCode) {         this.braCode = braCode;     }       public boolean isSingle() {         return isSingle;     }       public void setSingle(boolean single) {         isSingle = single;     }       public boolean isChecked() {         return isChecked;     }       public void setChecked(boolean isChecked) {         this.isChecked = isChecked;     }       public Node() {     }       public int getIcon() {         return icon;     }       public void setIcon(int icon) {         this.icon = icon;     }       public T getId() {         return id;     }       public void setId(T id) {         this.id = id;     }       public T getpId() {         return pId;     }       public void setpId(T pId) {         this.pId = pId;     }       public String getName() {         return name;     }       public void setName(String name) {         this.name = name;     }       public void setLevel(int level) {         this.level = level;     }       public boolean isExpand() {         return isExpand;     }       public List<Node> getChildren() {         return children;     }       public void setChildren(List<Node> children) {         this.children = children;     }       public Node getParent() {         return parent;     }       public void setParent(Node parent) {         this.parent = parent;     }       /**      * 是否为跟节点      *      * @return      */     public boolean isRoot() {         return parent == null;     }       /**      * 判断父节点是否展开      *      * @return      */     public boolean isParentExpand() {         if (parent == null){             return false;         }         return parent.isExpand();     }       /**      * 是否是叶子界点      *      * @return      */     public boolean isLeaf() {         return children.size() == 0;     }       /**      * 获取level      */     public int getLevel() {         return parent == null ? 0 : parent.getLevel() + 1;     }       /**      * 设置展开      *      * @param isExpand      */     public void setExpand(boolean isExpand) {         this.isExpand = isExpand;         if (!isExpand) {             for (Node node : children) {                 node.setExpand(false);             }         }     } }

2. OnTreeNodeClickListener.java

public interface OnTreeNodeClickListener {     /**      * 点击事件方法      * @param node 节点      * @param position 条目位置      */     void onClick(Node node, int position); }

3. TreeHelper.java

public class TreeHelper {     /**      * 传入node  返回排序后的Node      *      * @param datas              传入数据      * @param defaultExpandLevel 默认展开等级      * @return      * @throws IllegalArgumentException      * @throws IllegalAccessException      */     public static List<Node> getSortedNodes(List<Node> datas, int defaultExpandLevel) {         List<Node> result = new ArrayList<Node>();         // 设置Node间父子关系         List<Node> nodes = convetData2Node(datas);         // 拿到根节点         List<Node> rootNodes = getRootNodes(nodes);         // 排序以及设置Node间关系         for (Node node : rootNodes) {             addNode(result, node, defaultExpandLevel, 1);         }         return result;     }       /**      * 过滤出所有可见的Node      *      * @param nodes      * @return      */     public static List<Node> filterVisibleNode(List<Node> nodes) {         List<Node> result = new ArrayList<Node>();           for (Node node : nodes) {             // 如果为跟节点,或者上层目录为展开状态             if (node.isRoot() || node.isParentExpand()) {                 setNodeIcon(node);                 result.add(node);             }         }         return result;     }       /**      * 设置Node间,父子关系;让每两个节点都比较一次,即可设置其中的关系      */     private static List<Node> convetData2Node(List<Node> nodes) {         for (int i = 0; i < nodes.size(); i++) {             Node n = nodes.get(i);             for (int j = i + 1; j < nodes.size(); j++) {                 Node m = nodes.get(j);                 //判断id是String,Integer                 if (m.getpId() instanceof String) {                     if (m.getpId().equals(n.getId())) {                         n.getChildren().add(m);                         m.setParent(n);                     } else if (m.getId().equals(n.getpId())) {                         m.getChildren().add(n);                         n.setParent(m);                     }                 } else if(m.getpId() instanceof Integer) {                     //这里就是修改的地方,因为这是Integer类,节点的地址是不一样的,所以不能直接使用==比较,要用equals()进行值的比较                     if (m.getpId().equals(n.getId())) {                         n.getChildren().add(m);                         m.setParent(n);                     } else if (m.getId().equals(n.getpId())) {                         m.getChildren().add(n);                         n.setParent(m);                     }                 }             }         }         return nodes;     }       /**      * 获取所有根节点      *      * @param nodes      * @return      */     private static List<Node> getRootNodes(List<Node> nodes) {         List<Node> root = new ArrayList<Node>();         for (Node node : nodes) {             if (node.isRoot()) {                 root.add(node);             }         }         return root;     }       /**      * 把一个节点上的所有的内容都挂上去      */     private static <T, B> void addNode(List<Node> nodes, Node<T, B> node,                                        int defaultExpandLeval, int currentLevel) {         nodes.add(node);         //判断添加新节点的时候,保持以前的状态不变         if (node.isNewAdd && defaultExpandLeval >= currentLevel) {             node.setExpand(true);         }           if (node.isLeaf()) {             //判断是子节点             return;         }         for (int i = 0; i < node.getChildren().size(); i++) {             addNode(nodes, node.getChildren().get(i), defaultExpandLeval,                     currentLevel + 1);         }     }       /**      * 设置节点的图标      *      * @param node      */     private static void setNodeIcon(Node node) {         if (node.getChildren().size() > 0 && node.isExpand()) {             node.setIcon(node.iconExpand);         } else if (node.getChildren().size() > 0 && !node.isExpand()) {             node.setIcon(node.iconNoExpand);         } else {             node.setIcon(-1);         }     } }

4. TreeRecyclerAdapter.java -----RecycleView形式的树形列表适配器

public abstract class TreeRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {       protected Context mContext;     /**      * 存储所有可见的Node      */     protected List<Node> mNodes = new ArrayList<>();     protected LayoutInflater mInflater;       /**      * 存储所有的Node      */       protected List<Node> mAllNodes = new ArrayList<>();       /**      * 点击的回调接口      */     private OnTreeNodeClickListener onTreeNodeClickListener;     /**      * 默认不展开      */     private int defaultExpandLevel = 0;       /**      * 展开与关闭的图片      */     private int iconExpand = -1, iconNoExpand = -1;     /**      * 当前被点击的位置      */     private int layoutPosition = -1;       public void setOnTreeNodeClickListener(OnTreeNodeClickListener onTreeNodeClickListener) {         this.onTreeNodeClickListener = onTreeNodeClickListener;     }       public TreeRecyclerAdapter(RecyclerView mTree, Context context, List<Node> datas,                                int defaultExpandLevel, int iconExpand, int iconNoExpand) {           this.iconExpand = iconExpand;         this.iconNoExpand = iconNoExpand;           for (Node node : datas) {             node.getChildren().clear();             node.iconExpand = iconExpand;             node.iconNoExpand = iconNoExpand;         }           this.defaultExpandLevel = defaultExpandLevel;         mContext = context;         /**          * 对所有的Node进行排序          */         mAllNodes = TreeHelper.getSortedNodes(datas, defaultExpandLevel);         /**          * 过滤出可见的Node          */         mNodes = TreeHelper.filterVisibleNode(mAllNodes);         mInflater = LayoutInflater.from(context);     }       /**      * @param mTree      * @param context      * @param datas      * @param defaultExpandLevel 默认展开几级树      */       public TreeRecyclerAdapter(RecyclerView mTree, Context context, List<Node> datas,                                int defaultExpandLevel) {         this(mTree, context, datas, defaultExpandLevel, -1, -1);     }       @Override     public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {         Node node = mNodes.get(position); //        convertView = getConvertView(node, position, convertView, parent);         // 设置内边距         int padding = DisplayUtil.dp2px(mContext,5);         holder.itemView.setPadding(DisplayUtil.dp2px(mContext,(node.getLevel()+1) * 15),                 padding,padding,padding);           //然后设置单选,修改如下         /**          * 设置节点点击时,可以展开以及关闭,将事件继续往外公布          */         holder.itemView.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 //获取当前点击的位置                 layoutPosition = holder.getLayoutPosition();                 expandOrCollapse(position);                   if (onTreeNodeClickListener != null) {                     onTreeNodeClickListener.onClick(mNodes.get(position),                             position);                 }             }         });           if(position == layoutPosition){             node.setSingle(true);         }else {             node.setSingle(false);         }           onBindViewHolder(node, holder, position);     }       @Override     public int getItemCount() {         return mNodes.size();     }       /**      * 清除掉之前数据并刷新  重新添加      *      * @param mlists      * @param defaultExpandLevel 默认展开几级列表      */     public void addDataAll(List<Node> mlists, int defaultExpandLevel) {         mAllNodes.clear();         addData(-1, mlists, defaultExpandLevel);     }       /**      * 在指定位置添加数据并刷新 可指定刷新后显示层级      *      * @param index      * @param mlists      * @param defaultExpandLevel 默认展开几级列表      */     public void addData(int index, List<Node> mlists, int defaultExpandLevel) {         this.defaultExpandLevel = defaultExpandLevel;         notifyData(index, mlists);     }       /**      * 在指定位置添加数据并刷新      *      * @param index      * @param mlists      */     public void addData(int index, List<Node> mlists) {         notifyData(index, mlists);     }       /**      * 添加数据并刷新      *      * @param mlists      */     public void addData(List<Node> mlists) {         addData(mlists, defaultExpandLevel);     }       /**      * 添加数据并刷新 可指定刷新后显示层级      *      * @param mlists      * @param defaultExpandLevel      */     public void addData(List<Node> mlists, int defaultExpandLevel) {         this.defaultExpandLevel = defaultExpandLevel;         notifyData(-1, mlists);     }       /**      * 添加数据并刷新      *      * @param node      */     public void addData(Node node) {         addData(node, defaultExpandLevel);     }       /**      * 添加数据并刷新 可指定刷新后显示层级      *      * @param node      * @param defaultExpandLevel      */       public void addData(Node node, int defaultExpandLevel) {         List<Node> nodes = new ArrayList<>();         nodes.add(node);         this.defaultExpandLevel = defaultExpandLevel;         notifyData(-1, nodes);     }       /**      * 刷新数据      *      * @param index      * @param mListNodes      */     private void notifyData(int index, List<Node> mListNodes) {         for (int i = 0; i < mListNodes.size(); i++) {             Node node = mListNodes.get(i);             node.getChildren().clear();             node.iconExpand = iconExpand;             node.iconNoExpand = iconNoExpand;         }         for (int i = 0; i < mAllNodes.size(); i++) {             Node node = mAllNodes.get(i);             node.getChildren().clear();             node.isNewAdd = false;         }         if (index != -1) {             mAllNodes.addAll(index, mListNodes);         } else {             mAllNodes.addAll(mListNodes);         }         /**          * 对所有的Node进行排序          */         mAllNodes = TreeHelper.getSortedNodes(mAllNodes, defaultExpandLevel);         /**          * 过滤出可见的Node          */         mNodes = TreeHelper.filterVisibleNode(mAllNodes);         //刷新数据         notifyDataSetChanged();     }       /**      * 获取排序后所有节点      *      * @return      */     public List<Node> getAllNodes() {         if (mAllNodes == null){             mAllNodes = new ArrayList<Node>();         }         return mAllNodes;     }       /**      * 相应ListView的点击事件 展开或关闭某节点      *      * @param position      */     public void expandOrCollapse(int position) {         Node n = mNodes.get(position);           if (n != null) {             // 排除传入参数错误异常             if (!n.isLeaf()) {                 n.setExpand(!n.isExpand());                 mNodes = TreeHelper.filterVisibleNode(mAllNodes);                 notifyDataSetChanged();// 刷新视图             }         }     }       /**      * 设置多选      *      * @param node      * @param checked      */     protected void setChecked(final Node node, boolean checked) {         node.setChecked(checked);         setChildChecked(node, checked);         if (node.getParent() != null){             setNodeParentChecked(node.getParent(), checked);         }         notifyDataSetChanged();     }       /**      * 设置是否选中      *      * @param node      * @param checked      */     public <T, B> void setChildChecked(Node<T, B> node, boolean checked) {         if (!node.isLeaf()) {             node.setChecked(checked);             for (Node childrenNode : node.getChildren()) {                 setChildChecked(childrenNode, checked);             }         } else {             node.setChecked(checked);         }     }       private void setNodeParentChecked(Node node, boolean checked) {         if (checked) {             node.setChecked(checked);             if (node.getParent() != null){                 setNodeParentChecked(node.getParent(), checked);             }         } else {             List<Node> childrens = node.getChildren();             boolean isChecked = false;             for (Node children : childrens) {                 if (children.isChecked()) {                     isChecked = true;                 }             }             //如果所有自节点都没有被选中 父节点也不选中             if (!isChecked) {                 node.setChecked(checked);             }             if (node.getParent() != null){                 setNodeParentChecked(node.getParent(), checked);             }         }     }       public abstract void onBindViewHolder(Node node, RecyclerView.ViewHolder holder, final int position);       //===================在这里添加修改选中位置的方法=====================     /**      * 设置选中位置      * @param selectedPosition      */     public void setSelectedPosition(int selectedPosition) {         this.layoutPosition = selectedPosition;     } }

5. 自定义样式:

TypeTreeRecyclerAdapter.java

public class TypeTreeRecyclerAdapter extends TreeRecyclerAdapter {     private static final String TAG = "TypeTreeRecyclerAdapter";     private boolean isSingle;       public TypeTreeRecyclerAdapter(RecyclerView mTree, Context context, List<Node> datas, int defaultExpandLevel, int iconExpand, int iconNoExpand,boolean isSingle) {         super(mTree, context, datas, defaultExpandLevel, iconExpand, iconNoExpand);         this.isSingle = isSingle;     }       public TypeTreeRecyclerAdapter(RecyclerView mTree, Context context, List<Node> datas, int defaultExpandLevel) {         super(mTree, context, datas, defaultExpandLevel);     }       @Override     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         return new MyHoder(View.inflate(mContext, R.layout.tree_list_item,null));     }       @Override     public void onBindViewHolder(final Node node, RecyclerView.ViewHolder holder, int position) {         final MyHoder viewHolder = (MyHoder) holder;         //todo do something         viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) { //                setChecked(node,viewHolder.cb.isChecked());                 setChildChecked(node,viewHolder.cb.isChecked());                 listener.onItemClick(position);             }         });         viewHolder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {             @Override             public void onCheckedChanged(CompoundButton compoundButton, boolean b) {                 if (isSingle) {                     if (b) { //如果checkbox的状态是选中的,那么除了被选中的那条数据,其他Node节点的checkbox状态都为false                         for (int i = 0; i < mAllNodes.size(); i++) {                             if (((Node) mAllNodes.get(i)).getId().equals(node.getId())) {                                   Log.e(TAG,"note="+mAllNodes.get(i).getName());                                 ((Node) mAllNodes.get(i)).setChecked(b);                             } else { //                                Log.e(TAG,"1111 note="+mAllNodes.get(i).getName());                                 ((Node) mAllNodes.get(i)).setChecked(false);                             }                         }                     } else {//如果checkbox的状态是选中的,所有Node节点checkbox状态都为false                         for (int i = 0; i < mAllNodes.size(); i++) {                             if (((Node) mAllNodes.get(i)).getId().equals(node.getId())) {                                 ((Node) mAllNodes.get(i)).setChecked(b);                             }                         }                     }                 } else {   如果checkbox是多选的,对应node节点的checkbox状态视用户的操作而定                     for (int i = 0; i < mAllNodes.size(); i++) {                         if (((Node) mAllNodes.get(i)).getId().equals(node.getId()))                             ((Node) mAllNodes.get(i)).setChecked(b);                       }                 }             }         });           if (node.isChecked()){             viewHolder.cb.setChecked(true);         }else {             viewHolder.cb.setChecked(false);         }           if (node.getIcon() == -1) {             viewHolder.icon.setVisibility(View.INVISIBLE);         } else {             viewHolder.icon.setVisibility(View.VISIBLE);             viewHolder.icon.setImageResource(node.getIcon());         }           viewHolder.label.setText(node.getName());         }       public interface onAItemClickListener{         void onItemClick(int position);     }     private onAItemClickListener listener;     public void setOnItemClickListener (onAItemClickListener onItemClickListener) {         listener = onItemClickListener;     }       class MyHoder extends RecyclerView.ViewHolder{         public CheckBox cb;         public TextView label;         public ImageView icon;         public MyHoder(View itemView) {             super(itemView);             cb = (CheckBox) itemView.findViewById(R.id.cb_select_tree);             label = (TextView) itemView.findViewById(R.id.id_treenode_label);             icon = (ImageView) itemView.findViewById(R.id.icon);         }     } }

6. tree_list_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:orientation="horizontal"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:gravity="center_vertical">       <ImageView         android:id="@+id/icon"         android:layout_width="16dp"         android:layout_height="16dp"         android:scaleType="centerCrop"/>       <CheckBox         android:id="@+id/cb_select_tree"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_marginLeft="10dp"         android:layout_marginRight="10dp"         android:focusable="false"         />       <TextView         android:id="@+id/id_treenode_label"         android:layout_width="match_parent"         android:layout_height="wrap_content"         android:singleLine="true"         android:ellipsize="marquee"         android:textColor="#000"         android:textSize="14sp"/>   </LinearLayout>

7. 页面:

public class OfficeTypeDialog extends Dialog implements View.OnClickListener {     private static final String TAG = "OfficeTypeDialog";     private Context mContext;     private RecyclerView rv_typeTree;     private TypeTreeRecyclerAdapter typeTreeRecyclerAdapter;     private TypeTreeBean selectedBean;     private Button btn_confirm,btn_cancel;     private String source;     private String orgId;       public OfficeTypeDialog(@NonNull Context context) {         super(context);         mContext = context;     }       public OfficeTypeDialog(@NonNull Context context, int themeResId) {         super(context, themeResId);         mContext = context;     }       public OfficeTypeDialog(@NonNull Context context, int themeResId,String source) {         super(context, themeResId);         mContext = context;         this.source = source;     }       public OfficeTypeDialog(@NonNull Context context, int themeResId,String source,String orgId) {         super(context, themeResId);         mContext = context;         this.source = source;         this.orgId = orgId;     }       protected OfficeTypeDialog(@NonNull Context context, boolean cancelable, @Nullable OnCancelListener cancelListener) {         super(context, cancelable, cancelListener);         mContext = context;     }       @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.dialog_office_type);           getWindow().setGravity(Gravity.CENTER); //显示在         WindowManager m = getWindow().getWindowManager();         Display d = m.getDefaultDisplay();         WindowManager.LayoutParams p = getWindow().getAttributes();         p.width = d.getWidth()/5*4; //设置dialog的宽度为当前手机屏幕的宽度           p.height = d.getHeight()/5*4;         getWindow().setAttributes(p);           rv_typeTree = findViewById(R.id.rv_typeTree);         btn_confirm = findViewById(R.id.btn_confirm);         btn_cancel = findViewById(R.id.btn_cancel);         btn_confirm.setOnClickListener(this);         btn_cancel.setOnClickListener(this);           getOfficeType();     }       List<Node> mDatas = new ArrayList<>();     private List<TypeTreeBean> typeTreeBeans = new ArrayList<>();     private void getOfficeType() {         String url = "";         if (source.equals("officeType")) {             url = WebApi.OFFICE_TYPE;         } else if(source.equals("area")) {             url = WebApi.OFFICE_AREA;         } else if(source.equals("nmpa")) {               url = WebApi.OFFICE_NMPA;         } else if(source.equals("nmpaUser")) {             if (orgId != null) {                 url = WebApi.OFFICE_NMPA_USER+"?orgId="+orgId;             }         }         OkHttpUtil.get(TAG, url, new StringCallback() {             @Override             public void onError(Call call, Exception e, int id) {                 Log.e(TAG,"getOfficeType e="+e);             }               @Override             public void onResponse(String response, int id) {                 Log.e(TAG,"getOfficeType response="+response);                 try {                     JSONObject object = new JSONObject(response);                     if (object.getInt("code") == 200) {                         JSONArray array = object.getJSONArray("data");                         Gson gson = new Gson();                         for (int i = 0;i<array.length();i++) {                             TypeTreeBean typeTreeBean = gson.fromJson(array.get(i).toString(), TypeTreeBean.class);                             typeTreeBeans.add(typeTreeBean);                         }                           for (int j=0;j<typeTreeBeans.size();j++) {                             TypeTreeBean typeTreeBean = typeTreeBeans.get(j);                             mDatas.add(new Node(typeTreeBean.getId(),0,typeTreeBean.getName(),typeTreeBean));                             if (typeTreeBean.getChildren() != null && typeTreeBean.getChildren().size() != 0) {                                 List<TypeTreeBean> typeTreeBeans1 = typeTreeBean.getChildren();                                 for (int j1 = 0;j1<typeTreeBeans1.size();j1++) {                                     TypeTreeBean typeTreeBean1 = typeTreeBeans1.get(j1);                                     mDatas.add(new Node(typeTreeBean1.getId(),typeTreeBean.getId(),typeTreeBean1.getName(),typeTreeBean1));                                     if (typeTreeBean1.getChildren() != null && typeTreeBean1.getChildren().size() != 0) {                                         List<TypeTreeBean> typeTreeBeans2 = typeTreeBean1.getChildren();                                         for (int j2 = 0;j2<typeTreeBeans2.size();j2++) {                                             TypeTreeBean typeTreeBean2 = typeTreeBeans2.get(j2);                                             mDatas.add(new Node(typeTreeBean2.getId(),typeTreeBean1.getId(),typeTreeBean2.getName(),typeTreeBean2));                                             if (typeTreeBean2.getChildren() != null && typeTreeBean2.getChildren().size() != 0) {                                                 List<TypeTreeBean> typeTreeBeans3 = typeTreeBean2.getChildren();                                                 for (int j3 = 0;j3<typeTreeBeans3.size();j3++) {                                                     TypeTreeBean typeTreeBean3 = typeTreeBeans3.get(j3);                                                     mDatas.add(new Node(typeTreeBean3.getId(),typeTreeBean2.getId(),typeTreeBean3.getName(),typeTreeBean3));                                                     if (typeTreeBean3.getChildren() != null && typeTreeBean3.getChildren().size() != 0) {                                                         List<TypeTreeBean> typeTreeBeans4 = typeTreeBean3.getChildren();                                                         for (int j4 = 0;j4<typeTreeBeans4.size();j4++) {                                                             TypeTreeBean typeTreeBean4 = typeTreeBeans4.get(j4);                                                             mDatas.add(new Node(typeTreeBean4.getId(),typeTreeBean3.getId(),typeTreeBean4.getName(),typeTreeBean4));                                                         }                                                     }                                                 }                                             }                                         }                                     }                                 }                             }                         }                           initTypeList();                     }                 } catch (JSONException e) {                     e.printStackTrace();                 }             }         });     }       private void initTypeList() {         rv_typeTree.setLayoutManager(new LinearLayoutManager(mContext));         typeTreeRecyclerAdapter = new TypeTreeRecyclerAdapter(rv_typeTree, mContext,                 mDatas, 1,R.drawable.tree_expand,R.drawable.tree_econpand, true);         rv_typeTree.setAdapter(typeTreeRecyclerAdapter);         typeTreeRecyclerAdapter.setOnItemClickListener(new TypeTreeRecyclerAdapter.onAItemClickListener() {             @Override             public void onItemClick(int position) {                 Log.e(TAG,"position="+position);                 updatePosition(position);                 clickShow();             }         });     }       /**      * 更新选择窗      *      * @param selectedPosition 选中位置      */     public void updatePosition(int selectedPosition) {         if (typeTreeRecyclerAdapter != null) {             typeTreeRecyclerAdapter.setSelectedPosition(selectedPosition);             typeTreeRecyclerAdapter.notifyDataSetChanged();         }     }       /**      * 显示选中数据      */     public void clickShow(){ //        StringBuilder sb = new StringBuilder();         List<TypeTreeBean> typeTreeBeanList = new ArrayList<>();         final List<Node> allNodes = typeTreeRecyclerAdapter.getAllNodes();         for (int i = 0; i < allNodes.size(); i++) {             if (allNodes.get(i).isChecked()){ //                sb.append(allNodes.get(i).getName()+",");                 typeTreeBeanList.add((TypeTreeBean) allNodes.get(i).bean);             }         } //        String strNodesName = sb.toString();         if (typeTreeBeanList != null && typeTreeBeanList.size() != 0) {             Log.e(TAG,"bean="+typeTreeBeanList.get(0).getName());             selectedBean = typeTreeBeanList.get(0);         }       }       /**      * 设置确定取消按钮的回调      */     public OnClickBottomListener onClickBottomListener;     public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {         this.onClickBottomListener = onClickBottomListener;     }     public interface OnClickBottomListener{         /**          * 点击确定按钮事件          */           public void onPositiveClick(TypeTreeBean typeBean);         /**          * 点击取消按钮事件          */         public void onNegtiveClick();     }       @Override     public void onClick(View view) {         switch (view.getId()) {             case R.id.btn_confirm:                 if ( onClickBottomListener!= null) {                     onClickBottomListener.onPositiveClick(selectedBean);                 }                 break;               case R.id.btn_cancel:                 if ( onClickBottomListener!= null) {                     onClickBottomListener.onNegtiveClick();                 }                 break;         }     } }

8. 调用dialog

OfficeTypeDialog typeDialog = new OfficeTypeDialog(mContext,R.style.Dialog,"officeType");    typeDialog.setOnClickBottomListener(new OfficeTypeDialog.OnClickBottomListener() {                     @Override                     public void onPositiveClick(TypeTreeBean typeBean) {                         tv_officeType.setText(typeBean.getName());                         officeType = typeBean;                         typeDialog.dismiss();                     }                       @Override                     public void onNegtiveClick() {                         typeDialog.dismiss();                     }                 });                 typeDialog.show();

9. 效果图

android RecycleView如何实现多级树形列表

感谢各位的阅读!关于“android RecycleView如何实现多级树形列表”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI