久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

android RecycleView實(shí)現(xiàn)多級(jí)樹(shù)形列表

瀏覽:12日期:2022-09-18 11:59:44

本文實(shí)例為大家分享了android RecycleView實(shí)現(xiàn)多級(jí)樹(shù)形列表的具體代碼,供大家參考,具體內(nèi)容如下

實(shí)現(xiàn)多級(jí)樹(shù)狀列表:

1. Node.java

public class Node<T, B> implements Serializable { /** * 傳入的實(shí)體對(duì)象 */ public B bean; /** * 設(shè)置開(kāi)啟的圖片 */ public int iconExpand = -1; /** * 設(shè)置關(guān)閉的圖片 */ public int iconNoExpand = -1; private T id; /** * 根節(jié)點(diǎn)pId為0 */ private T pId; private String name; /** * 當(dāng)前的級(jí)別 */ private int level; /** * 是否展開(kāi) */ private boolean isExpand = false; private int icon = -1; /** * 下一級(jí)的子Node */ private List<Node> children = new ArrayList<>(); /** * 父Node */ private Node parent; /** * 是否被checked選中 */ private boolean isChecked; /** * 是否為新添加的 */ public boolean isNewAdd = true; /** * 單選標(biāo)記 */ 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; } /** * 是否為跟節(jié)點(diǎn) * * @return */ public boolean isRoot() {return parent == null; } /** * 判斷父節(jié)點(diǎn)是否展開(kāi) * * @return */ public boolean isParentExpand() {if (parent == null){ return false;}return parent.isExpand(); } /** * 是否是葉子界點(diǎn) * * @return */ public boolean isLeaf() {return children.size() == 0; } /** * 獲取level */ public int getLevel() {return parent == null ? 0 : parent.getLevel() + 1; } /** * 設(shè)置展開(kāi) * * @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 { /** * 點(diǎn)擊事件方法 * @param node 節(jié)點(diǎn) * @param position 條目位置 */ void onClick(Node node, int position);}

3. TreeHelper.java

public class TreeHelper { /** * 傳入node 返回排序后的Node * * @param datas 傳入數(shù)據(jù) * @param defaultExpandLevel 默認(rèn)展開(kāi)等級(jí) * @return * @throws IllegalArgumentException * @throws IllegalAccessException */ public static List<Node> getSortedNodes(List<Node> datas, int defaultExpandLevel) {List<Node> result = new ArrayList<Node>();// 設(shè)置Node間父子關(guān)系List<Node> nodes = convetData2Node(datas);// 拿到根節(jié)點(diǎn)List<Node> rootNodes = getRootNodes(nodes);// 排序以及設(shè)置Node間關(guān)系for (Node node : rootNodes) { addNode(result, node, defaultExpandLevel, 1);}return result; } /** * 過(guò)濾出所有可見(jiàn)的Node * * @param nodes * @return */ public static List<Node> filterVisibleNode(List<Node> nodes) {List<Node> result = new ArrayList<Node>(); for (Node node : nodes) { // 如果為跟節(jié)點(diǎn),或者上層目錄為展開(kāi)狀態(tài) if (node.isRoot() || node.isParentExpand()) {setNodeIcon(node);result.add(node); }}return result; } /** * 設(shè)置Node間,父子關(guān)系;讓每?jī)蓚€(gè)節(jié)點(diǎn)都比較一次,即可設(shè)置其中的關(guān)系 */ 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,Integerif (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) { //這里就是修改的地方,因?yàn)檫@是Integer類(lèi),節(jié)點(diǎn)的地址是不一樣的,所以不能直接使用==比較,要用equals()進(jìn)行值的比較 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; } /** * 獲取所有根節(jié)點(diǎn) * * @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; } /** * 把一個(gè)節(jié)點(diǎn)上的所有的內(nèi)容都掛上去 */ private static <T, B> void addNode(List<Node> nodes, Node<T, B> node, int defaultExpandLeval, int currentLevel) {nodes.add(node);//判斷添加新節(jié)點(diǎn)的時(shí)候,保持以前的狀態(tài)不變if (node.isNewAdd && defaultExpandLeval >= currentLevel) { node.setExpand(true);} if (node.isLeaf()) { //判斷是子節(jié)點(diǎn) return;}for (int i = 0; i < node.getChildren().size(); i++) { addNode(nodes, node.getChildren().get(i), defaultExpandLeval, currentLevel + 1);} } /** * 設(shè)置節(jié)點(diǎn)的圖標(biāo) * * @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形式的樹(shù)形列表適配器

public abstract class TreeRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { protected Context mContext; /** * 存儲(chǔ)所有可見(jiàn)的Node */ protected List<Node> mNodes = new ArrayList<>(); protected LayoutInflater mInflater; /** * 存儲(chǔ)所有的Node */ protected List<Node> mAllNodes = new ArrayList<>(); /** * 點(diǎn)擊的回調(diào)接口 */ private OnTreeNodeClickListener onTreeNodeClickListener; /** * 默認(rèn)不展開(kāi) */ private int defaultExpandLevel = 0; /** * 展開(kāi)與關(guān)閉的圖片 */ private int iconExpand = -1, iconNoExpand = -1; /** * 當(dāng)前被點(diǎn)擊的位置 */ 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;/** * 對(duì)所有的Node進(jìn)行排序 */mAllNodes = TreeHelper.getSortedNodes(datas, defaultExpandLevel);/** * 過(guò)濾出可見(jiàn)的Node */mNodes = TreeHelper.filterVisibleNode(mAllNodes);mInflater = LayoutInflater.from(context); } /** * @param mTree * @param context * @param datas * @param defaultExpandLevel 默認(rèn)展開(kāi)幾級(jí)樹(shù) */ 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);// 設(shè)置內(nèi)邊距int padding = DisplayUtil.dp2px(mContext,5);holder.itemView.setPadding(DisplayUtil.dp2px(mContext,(node.getLevel()+1) * 15),padding,padding,padding); //然后設(shè)置單選,修改如下/** * 設(shè)置節(jié)點(diǎn)點(diǎn)擊時(shí),可以展開(kāi)以及關(guān)閉,將事件繼續(xù)往外公布 */holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {//獲取當(dāng)前點(diǎn)擊的位置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(); } /** * 清除掉之前數(shù)據(jù)并刷新 重新添加 * * @param mlists * @param defaultExpandLevel 默認(rèn)展開(kāi)幾級(jí)列表 */ public void addDataAll(List<Node> mlists, int defaultExpandLevel) {mAllNodes.clear();addData(-1, mlists, defaultExpandLevel); } /** * 在指定位置添加數(shù)據(jù)并刷新 可指定刷新后顯示層級(jí) * * @param index * @param mlists * @param defaultExpandLevel 默認(rèn)展開(kāi)幾級(jí)列表 */ public void addData(int index, List<Node> mlists, int defaultExpandLevel) {this.defaultExpandLevel = defaultExpandLevel;notifyData(index, mlists); } /** * 在指定位置添加數(shù)據(jù)并刷新 * * @param index * @param mlists */ public void addData(int index, List<Node> mlists) {notifyData(index, mlists); } /** * 添加數(shù)據(jù)并刷新 * * @param mlists */ public void addData(List<Node> mlists) {addData(mlists, defaultExpandLevel); } /** * 添加數(shù)據(jù)并刷新 可指定刷新后顯示層級(jí) * * @param mlists * @param defaultExpandLevel */ public void addData(List<Node> mlists, int defaultExpandLevel) {this.defaultExpandLevel = defaultExpandLevel;notifyData(-1, mlists); } /** * 添加數(shù)據(jù)并刷新 * * @param node */ public void addData(Node node) {addData(node, defaultExpandLevel); } /** * 添加數(shù)據(jù)并刷新 可指定刷新后顯示層級(jí) * * @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); } /** * 刷新數(shù)據(jù) * * @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);}/** * 對(duì)所有的Node進(jìn)行排序 */mAllNodes = TreeHelper.getSortedNodes(mAllNodes, defaultExpandLevel);/** * 過(guò)濾出可見(jiàn)的Node */mNodes = TreeHelper.filterVisibleNode(mAllNodes);//刷新數(shù)據(jù)notifyDataSetChanged(); } /** * 獲取排序后所有節(jié)點(diǎn) * * @return */ public List<Node> getAllNodes() {if (mAllNodes == null){ mAllNodes = new ArrayList<Node>();}return mAllNodes; } /** * 相應(yīng)ListView的點(diǎn)擊事件 展開(kāi)或關(guān)閉某節(jié)點(diǎn) * * @param position */ public void expandOrCollapse(int position) {Node n = mNodes.get(position); if (n != null) { // 排除傳入?yún)?shù)錯(cuò)誤異常 if (!n.isLeaf()) {n.setExpand(!n.isExpand());mNodes = TreeHelper.filterVisibleNode(mAllNodes);notifyDataSetChanged();// 刷新視圖 }} } /** * 設(shè)置多選 * * @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(); } /** * 設(shè)置是否選中 * * @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;} } //如果所有自節(jié)點(diǎn)都沒(méi)有被選中 父節(jié)點(diǎn)也不選中 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); //===================在這里添加修改選中位置的方法===================== /** * 設(shè)置選中位置 * @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 somethingviewHolder.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的狀態(tài)是選中的,那么除了被選中的那條數(shù)據(jù),其他Node節(jié)點(diǎn)的checkbox狀態(tài)都為falsefor (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的狀態(tài)是選中的,所有Node節(jié)點(diǎn)checkbox狀態(tài)都為falsefor (int i = 0; i < mAllNodes.size(); i++) { if (((Node) mAllNodes.get(i)).getId().equals(node.getId())) {((Node) mAllNodes.get(i)).setChecked(b); }} }} else { 如果checkbox是多選的,對(duì)應(yīng)node節(jié)點(diǎn)的checkbox狀態(tài)視用戶(hù)的操作而定 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'> <ImageViewandroid: android:layout_width='16dp'android:layout_height='16dp'android:scaleType='centerCrop'/> <CheckBoxandroid: android:layout_width='wrap_content'android:layout_height='wrap_content'android:layout_marginLeft='10dp'android:layout_marginRight='10dp'android:focusable='false'/> <TextViewandroid: android:layout_width='match_parent'android:layout_height='wrap_content'android:singleLine='true'android:ellipsize='marquee'android:textColor='#000'android:textSize='14sp'/> </LinearLayout>

7. 頁(yè)面:

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; //設(shè)置dialog的寬度為當(dāng)前手機(jī)屏幕的寬度 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();} } /** * 顯示選中數(shù)據(jù) */ 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);} } /** * 設(shè)置確定取消按鈕的回調(diào) */ public OnClickBottomListener onClickBottomListener; public void setOnClickBottomListener(OnClickBottomListener onClickBottomListener) {this.onClickBottomListener = onClickBottomListener; } public interface OnClickBottomListener{/** * 點(diǎn)擊確定按鈕事件 */ public void onPositiveClick(TypeTreeBean typeBean);/** * 點(diǎn)擊取消按鈕事件 */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. 調(diào)用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實(shí)現(xiàn)多級(jí)樹(shù)形列表

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 欧美在线小视频 | 玖玖爱视频在线 | 99精品国产一区二区 | 精品久久久久香蕉网 | 97在线观看视频 | 91精品国产综合久久久久久蜜臀 | 天堂一区 | 日本一区二区三区视频免费看 | 亚洲综合二区 | 日韩在线视频一区 | 国产成人精品午夜 | 在线视频自拍 | 成人在线小视频 | 天天干天天干天天干天天射 | 桃色五月| 人人澡人人射 | 欧美一区不卡 | 狠狠艹夜夜艹 | 久久久影视| 激情欧美一区二区三区中文字幕 | 91精品久久久久久久久久久久久久久 | 99精品视频在线免费观看 | 91精品国产综合久久国产大片 | 日韩精品极品视频在线 | 色免费视频 | 欧美 中文字幕 | 91国内精品久久 | 成人久久精品 | 午夜影院在线观看 | 91网站在线看 | 91佛爷在线观看 | 伊人伊人网 | 天天综合网久久综合网 | 国产精品视频一区二区三区不卡 | 亚洲乱码国产乱码精品精98午夜 | 成人免费看片 | 久久久一区二区 | 欧美日韩在线视频一区 | 91夜夜蜜桃臀一区二区三区 | 日韩91视频| 国产精品久久久爽爽爽麻豆色哟哟 | 亚洲精品91 | 伊人网站 | 99国产精品一区 | 国产精品久久精品 | 黄色一级片在线观看 | 欧美激情亚洲 | 国产噜噜噜噜噜久久久久久久久 | 亚洲伊人久久综合 | 色欧美综合 | 一区视频| 精品一区二区三区四区五区 | 久久久久久久 | 久久亚洲视频 | www.xxx免费 | 精品国产一区二区三区久久影院 | 中国黄色在线视频 | 日韩精品一二三 | 国产在线精品二区 | 99久久久久久 | 中文字幕亚洲一区二区三区 | 国产欧美一区二区三区在线看 | 99爱在线观看 | 99re久久 | 精品99在线 | 中文字幕一区在线观看 | 天堂国产 | 亚洲一区不卡在线 | 久久久久亚洲一区二区三区 | 国产亚洲一区二区三区 | 91色站| 国产精品久久久久久久久久久久冷 | 久久久久国产视频 | 婷婷色在线| av成人免费| 狠狠操网站 | 免费观看黄色一级大片 | 中文字幕一区在线观看视频 | 高清av网站| 日日爱视频 | 成人精品 | 国产精品欧美一区二区三区 | 日韩精品一区二区三区 | 亚洲三级在线观看 | 欧美精品久 | 白浆视频在线观看 | 亚洲乱码国产乱码精品精的特点 | 国产精品久久电影观看 | 美日韩精品视频 | 羞羞视频在线播放 | 国产精品网站在线看 | 欧美精品在线免费观看 | 欧美精品理论片大全 | 免费黄色看片 | 一区二区三区亚洲 | 国产日韩精品一区二区 | 69av在线视频 | 国产精品自产拍在线观看 | 一区二区三区在线视频播放 | 日韩精品成人 | 国产亚洲欧美在线 | 在线观看成人国产 | 蜜臀av在线播放一区二区三区 | 免费黄在线观看 | 日本一区二区成人 | 亚洲国产情侣自拍 | 亚洲欧美日韩国产综合 | 成人小视频在线播放 | 色综合天天综合网国产成人网 | 国产黄色av | www.久久精品 | 91在线国产观看 | 欧美日韩中文字幕在线 | 国产精品久久九九 | 免费黄色特级片 | 欧洲尺码日本国产精品 | 日本久久精品 | 91精品国产综合久久久久久丝袜 | 久久精品99| 国产精品99久久久久久久vr | 中文字幕在线永久在线视频 | 欧美日韩免费一区二区三区 | 一区二区三区日韩精品 | 久久精品免费一区二区三区 | 天天爽天天草 | 国产一级毛片电影 | 成人免费一区二区三区视频网站 | 欧美精品一 | 日韩欧美精品在线 | 一本一道久久久a久久久精品91 | 91精品视频在线播放 | 欧州一区二区三区 | 国产日韩中文字幕 | 欧美精品91| www.一级电影| 精品伊人| 五月天婷婷综合 | 国产高清中文字幕 | av在线一区二区三区 | 天堂免费在线 | 最新国产精品 | 亚洲综合影院 | 多p视频 | 亚州激情 | 亚洲国产视频一区 | 亚洲综合色视频在线观看 | 看片国产 | 亚洲一区二区三区高清 | 国产精品欧美一区二区 | 精品免费视频 | 欧美精品在线一区二区三区 | 成人久久久精品乱码一区二区三区 | 一区二区三区在线视频播放 | 天天爽夜夜爽夜夜爽精品视频 | 亚洲成人精品网 | 久久视频免费 | 日干夜操 | 亚洲人人 | 你懂的免费在线观看 | 91精品国产91久久久久久密臀 | 国产情侣免费视频 | 精品一二三区 | 天天操,夜夜操 | 99re国产 | 国产精品一区在线观看你懂的 | 欧美成年黄网站色视频 | 亚洲精品成人在线 | 在线色网 | 成人 在线 | 久久com| 久热免费在线观看 | 久久成人在线视频 | 亚洲国产区 | 中文字幕视频在线 | 精品三级三级三级三级三级 | 毛片久久久 | 午夜久久久 | 黄色片网站在线免费观看 | h网站在线观看 | 国产一区久久精品 | a久久久 | 国产伦精品一区二区三区高清 | 亚洲高清在线观看视频 | 精品欧美一区二区精品久久久 | 国产一区二区精品在线 | 欧美日韩精品 | 国产精品久久久久久 | 99精品视频在线 | 日韩视频中文字幕 | 国产精品久久久久毛片软件 | 黄网站免费在线观看 | 国产欧美精品一区二区 | 亚洲一级黄色 | 秋霞av电影 | 久久六月| 成年视频在线观看福利资源 | 黄色一级免费看 | 人人澡人人草 | 成人午夜免费视频 | 成人日韩 | 91精品国产欧美一区二区成人 | 日韩视频在线一区二区 | 国产一区二区三区在线免费观看 | 久久精品1 | 精品99久久 | 色婷婷av久久久久久久 | 精品国产乱码久久久久久久软件 | 日韩精品在线一区 | 欧美午夜在线观看 | 久久成人精品 | 久久四色 | 亚洲精品日韩激情在线电影 | 国产一级黄色大片 | 亚洲不卡 | 日韩视频中文字幕 | 亚洲欧洲日韩在线 | 天堂中文av在线 | 国产成人高清 | 亚洲精品国产setv | 国产精品久久九九 | 亚洲精品66 | 超碰av在线 | 国产一区二区三区不卡在线观看 | 午夜在线 | 国产丝袜一区 | 精品国产乱码久久久久久蜜柚 | 亚洲欧美激情在线 | 中文字幕av第一页 | www.国产.com| 日本三级在线视频 | 日韩成人在线免费视频 | 二区在线视频 | 亚洲 欧美 日韩在线 | 日本在线免费电影 | 欧美精品在线免费观看 | 99免费精品| 成人国产电影 | 亚洲a人 | 日韩国产欧美视频 | 欧美中文字幕 | 成人免费看黄 | 欧洲在线一区 | 欧美在线观看一区 | 午夜精品福利网 | 欧美性猛交一区二区三区精品 | av动漫一区二区 | 欧美日韩不卡合集视频 | 成人在线 | 午夜免费一区二区播放 | 国产精品免费观看 | www中文字幕 | 欧美精品tv | 精品护士一区二区三区 | 欧美日在线 | 精品一区二区三区免费 | av一级毛片| 日韩在线视频网站 | 亚洲精品久久久久久久久久 | 一级毛片在线播放 | 欧美成人区 | 国产在线观看一区二区 | 欧美日韩在线观看视频 | 中文字幕第一页在线视频 | 国产九九av | 亚洲三区在线观看 | 韩日av在线 | 久久国产精品久久 | 亚洲一区二区三区四区的 | 欧美日韩一区二区中文字幕 | 国产一区二区视频在线 | 精品国产区 | 四虎久久精品 | 一区二区中文字幕 | 婷婷亚洲五月 | 成人精品久久久 | 亚洲国产二区 | 超碰高清 | 国产精品成人国产乱一区 | 日韩一区二区在线观看视频 | 91精品国产综合久久福利 | 色悠悠久久 | 视频在线一区二区 | 99免费精品 | 亚洲精品久久久一区二区三区 | 免费看片一区二区三区 | 国产羞羞视频免费在线观看 | 国产精品无码久久久久 | 狠狠干美女 | 久久久久国产精品一区二区三区 | 不卡视频一区 | 欧美一区精品 | 国产一区精品电影 | 久色 | av性色| 伊人99 | 6080亚洲精品一区二区 | 黄色拍拍视频 | 鲁一鲁综合 | 午夜在线一区 | 国产精品久久久久久久久免费高清 | 在线欧美成人 | 久久88 | 一区二区在线视频 | 亚洲欧美激情另类 | 亚洲精品久久久久国产 | 国产一区久久 | 中文字幕亚洲一区二区va在线 | 日韩一区在线视频 | 久久精品亚洲 | 欧美激情一区二区三区 | www.久久久.com | 亚洲成人免费在线观看 | 精品国产一区一区二区三亚瑟 | 日韩免费在线视频 | 一色视频 | 欧美午夜视频 | 成人一级电影在线观看 | 久久久久久久影院 | 欧美黄色片 | 成人午夜激情 | 久久综合久 | 色欧美片视频在线观看 | 久久久91精品国产一区二区 | 国产不卡精品视频 | 日日骚视频 | 日本久久久久久 | 成人中文视频 | 综合自拍偷拍 | 国产v日产∨综合v精品视频 | 91视频在线 | 日韩精品一区二区三区在线 | 亚洲欧美日韩精品 | 欧美精品不卡 | 国产精品theporn | 亚洲在线免费观看 | 国产精品美女久久久久久免费 | 欧美精品在线一区二区三区 | 在线观看a视频 | 91性高湖久久久久久久久网站 | 日韩三区| 亚洲一二三 | 在线观看91 | 在线色网站 | 日日日操 | 午夜视频免费网站 | 中文字幕观看 | 99热播在线 | 久草美女| 午夜精品导航 | 国产美女久久 | 亚洲欧美日韩系列 | 免费视频二区 | 国产精品国产自产拍高清 | 午夜久久久 | 亚洲欧美激情在线 | 国产欧美日韩综合精品 | 欧美性猛交一区二区三区精品 | 国产精品一区二区三 | 久久日韩 | 亚洲国产精品久久 | 亚洲a网 | 亚洲一区二区免费看 | 国产91精品一区二区绿帽 | 在线日韩一区 | 亚洲 欧美 另类 综合 偷拍 | 伊人久麻豆社区 | 欧美日韩精品一区二区三区 | 不卡中文一区 | 日韩精品一区二区三区视频播放 | 亚洲国产精品自拍 | 日韩av在线免费 | 午夜精品久久久久久久久久久久 | 一区二区三区视频 | 色婷婷久久 | 一区二区视频在线观看 | 国产一级特黄 | 日韩成人在线观看 | 国产一区二区在线免费 | 中国女人黄色大片 | 国产不卡在线 | 国产一级特黄 | 欧美一区二区三区免费 | 国产一区二区三区免费在线观看 | 日日操操 | 国产一区二区精品在线 | 亚洲欧美激情精品一区二区 | 国产在线不卡 | 中文欧美日韩 | 欧美精品福利 | 久久成人国产视频 | 久久99精品久久久 | 日韩一区二区在线观看 | 国产精品美女久久久久aⅴ国产馆 | 亚洲精品一区中文字幕乱码 | 成年人在线观看视频 | 国产传媒在线视频 | 国产精品久久久久久久久免费桃花 | 国产精品中文字幕在线播放 | 国产精品久久 | 国产特级毛片 | 一级片视频免费 | 美女毛片 | 亚洲午夜视频在线观看 | 国产激情在线观看 | 天天干天天躁 | 欧美成年黄网站色视频 | 成人亚洲视频 | 91免费版在线观看 | 精品一区二区久久久久久久网站 | 国产成人精品久久二区二区 | 在线观看亚洲视频 | 免费黄色小视频 | 国产一区二区三区在线 | 五月婷婷综合激情网 | 国产美女网站视频 | 一区二区三 | 亚洲久久久久 | 国产精品福利91 | 国产精品视频入口 | 国产高潮好爽受不了了夜色 | 二区视频 | 精品久久99| 国产精品无码永久免费888 | 国产精品久久久一区二区 | 国产在线观看一区 | 成人午夜av| 日韩综合一区 | 日本在线视频中文字幕 | 成人福利在线 | 最新黄色网址在线播放 | 欧美精品福利视频 | 久久久精| 日本精品一区二区三区视频 | av动漫一区二区 | 久久久久国 | 免费观看一级特黄欧美大片 | 久久爱成人 | 亚洲精品91 | 国产69精品久久久久观看黑料 | 日韩中文视频 | 免费一区二区三区 | 免费一区二区三区 | 亚洲a网 | 久久午夜综合久久 | 日韩精品影院 | 国产精品高清在线观看 | 久久国产亚洲 | 亚洲国产精品一区二区久久 | 99精品一级欧美片免费播放 | 九九亚洲视频 | 日本午夜在线 | 成人午夜视频在线观看 | 97国产精品视频人人做人人爱 | 精品国产三级 | 久久色av| 成人精品一区 | 久久国产精品99久久久久久老狼 | 精品久久久久久久久久久久久久久 | 精品二三区 | 亚洲一区二区中文字幕 | 日韩av免费在线观看 | 91九色视频国产 | 日韩三级网 | 成人在线黄色 | 欧美视频二区 | 日韩啊啊啊 | 日韩在线资源 | 欧美高清视频在线观看 | 亚洲不卡网站 | 福利视频一区 | 亚洲成人精品 | 日韩成人av在线 | 超级碰在线视频 | 九九porny88av| 欧美成人a∨高清免费观看 在线视频成人 | 久久精品这里有 | 久久精品欧美一区二区三区不卡 | 99久久婷婷 | 午夜免费一区二区播放 | 日日干天天操 | 午夜成年人 | 蜜桃av中文字幕 | 在线免费观看色视频 | 天天草天天干 | 91中文字幕在线观看 | 亚洲视频在线免费观看 | 国产精品视频导航 | 日韩在线观看一区 | 一区二区三区免费 | 在线草| 黄色短视频在线观看 | 曰本人一级毛片免费完整视频 | 一区二区三区国产精品 | 极品久久 | 国产欧美日韩一区二区三区 | 一级全黄少妇性色生活片毛片 | 亚洲aaaaaa特级 | 亚洲伊人网站 | 国产欧美一二三区在线粉嫩 | 九色在线 | 97国产在线视频 | av在线免费观看一区二区 | 福利精品视频 | 一级视频网站 | 香蕉大人久久国产成人av | 国产精品久久久久一区二区三区 | 九九久久精品 | 国产一区二区欧美 | 日韩精品久久久久 | 国产日产精品一区二区三区四区 | 国产精品毛片一区二区在线看 | 在线视频中文字幕 | h在线看 | 欧美日韩在线一区二区三区 | 成人五月网| 先锋资源中文字幕 | 国产精品69毛片高清亚洲 | 欧美色视 | 三级视频在线观看 | 色综合久久一区二区三区 | 在线观看视频一区二区 | 91在线精品一区二区 | 亚洲色域网 | 激情欧美日韩一区二区 | 国产三级视频 | 欧美日韩一区二区三区在线电影 | 99国产精品 | 国产h视频在线观看 | 黄色片在线免费观看 | 久久久资源 | 国产精品毛片一区二区在线看 | 欧美一级二级视频 | www.99热.com | 99草在线视频 | 一区二区三区高清 | 九九色影院 | 欧美一区二区三区在线视频观看 | 久久久av | 91中文字幕在线观看 | 中文字幕最新在线 | 黄色一级片视频 | 日韩精品专区在线影院重磅 | 中文字幕在线资源 | 亚洲午夜一区 | 狠狠操操 | 天天干天天插 | 欧美日韩中文字幕 | 亚洲免费婷婷 | 久久久久久亚洲精品视频 | 91高清视频 | 欧美极品一区二区三区 | 久久亚洲天堂 | 国产成人综合视频 | 91免费在线看 | 麻豆精品久久 | 欧美三级免费观看 | 日本免费www| 国产精品夜间视频香蕉 | 久久精品视频网站 | 亚洲天堂中文字幕 | 一级片 | 91免费在线视频 | 免费亚洲婷婷 | av中文字幕在线观看 | 人人插人人干 | 国产干干干 | 国产精品久久久久久久一区探花 | 欧美不卡视频 | 99热精品视| 国产精品国产精品国产专区不片 | 国产高清美女一级a毛片久久 | 免费成人在线网站 | 久久青青 | 亚洲精品视频区 | 日本特黄特色aaa大片免费 | 亚洲精品久久久一区二区三区 | 欧美性18 | 欧美成人在线免费观看 | 欧美在线观看一区 | 欧美成人一区二区三区 | 大陆毛片 | 97免费在线观看视频 | 精品一区二区在线观看 | 成年人毛片视频 | 久久久久a | 欧美久久久久久久久久久久久久 | av免费在线播放 | 亚洲一道本 | 国产日本韩国在线 | 在线视频一二区 | 91精品国产高清自在线观看 | 国产中文一区二区三区 | 国产日韩精品一区二区 | 亚洲国产精品99久久久久久久久 | 日韩一区二区不卡 | 日韩手机专区 | 精品久久中文字幕 | 亚洲精品电影在线观看 | 日韩电影一区二区三区 | 老妇激情毛片免费 | 亚洲一区视频网站 | 久久久久久香蕉 | 亚洲精品一区在线观看 | 成人福利网站 | 国产午夜视频 | 久久久精品网 | 国产欧美精品一区二区 | 欧美日韩中文 | 中文字幕在线播放不卡 | 国产精品久久久久久久久久久小说 | 亚洲视频在线免费观看 | 久久亚洲国产精品 | 国产精品久久av | 性色爽爱 | 久久久久久综合 |