黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

您的位置:首頁技術文章
文章詳情頁

android RecycleView實現多級樹形列表

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

本文實例為大家分享了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,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) { //這里就是修改的地方,因為這是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 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的狀態是選中的,那么除了被選中的那條數據,其他Node節點的checkbox狀態都為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的狀態是選中的,所有Node節點checkbox狀態都為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是多選的,對應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'> <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. 頁面:

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
相關文章:
主站蜘蛛池模板: 色网站在线免费观看 | 天天爽夜夜爽人人爽一区二区 | 国产视频九色蝌蚪 | 国产在线精品一区二区三区 | 亚洲精品久久久久久国产精华液 | 国产女主播在线 | 欧美性猛交性大交 | 欧美成人免费在线观看 | 国产v亚洲v天堂无码久久久 | 把女邻居弄到潮喷的性经历 | 日本三级成本人网站 | 做爰猛烈叫床91 | 久久久国产视频 | 在线视频毛片 | 久久99久久99精品免观看 | 欧美成人秋霞久久aa片 | 国产农村熟妇videos | 噜噜噜久久亚洲精品国产品小说 | 亚洲日本欧美日韩高观看 | 午夜在线观看视频 | 日本一区二区三区在线观看视频 | 日本少妇做爰xxxⅹ漫 | 色男人av| 国产呻吟对白刺激无套视频在线 | 国产成人亚洲综合色婷婷 | 欧洲精品码一区二区三区 | 亚洲午夜在线播放 | 国产日韩在线观看一区 | 九九热久久免费视频 | 又色又爽又高潮免费视频观看 | 99国产欧美精品久久久蜜芽 | 国产成人午夜 | 国产噜噜噜噜久久久久久久久 | 99久久无色码中文字幕婷婷 | 野花社区www视频最新资源 | 激情97综合亚洲色婷婷五 | 视频一区二区在线播放 | 欧美人与禽猛交乱配视频 | 天天干天天舔天天射 | 成人午夜视频精品一区 | 国产精品毛片av | 亚洲精品无码av中文字幕电影网站 | 日韩午夜理论免费tv影院 | 国产午夜精品一区二区 | 久久人人看 | 欧美黄色激情视频 | 麻豆色淫网站av水蜜桃三级 | 亚洲 欧美 中文 在线 视频 | 一区二区乱子伦在线播放 | 国产91色在线 | 免费 | 久久久老司机 | 人妖干美女 | 99国产精品久久不卡毛片 | 成人激情开心网 | 国产精品美女久久久久av爽李琼 | 日韩黄色录像 | 无码成人1000部免费视频 | 国产三级a | 国产色频 | 成人做爰高潮片免费看 | 欧美日韩国产免费 | 性开放网站 | 欧美一区日韩一区 | 99国产在线观看 | 国产精品欧美亚洲777777 | 136福利视频导航 | 国精产品999永久天美 | 亚洲熟妇国产熟妇肥婆 | 亚洲中文字幕高清有码在线 | 毛色毛片免费观看 | 免费黄网在线观看 | 邻居少妇张开双腿让我爽一夜图片 | 波多野结衣潜藏淫欲 | 亚洲人成在线观看 | 国产成人av一区二区三区 | 少妇高潮惨叫久久麻豆传 | 国产精品99久 | 色欲av无码一区二区人妻 | 色之综合天天综合色天天棕色 | 毛片毛片女人毛片毛片 | 日本高清视频色wwwwww色 | 欧美精品在线观看一区二区 | 黄瓜视频成人 | 国产成人精品一区二区三区视频 | 国产黄色免费片 | 五十老熟妇乱子伦免费观看 | 窝窝午夜精品一区二区 | 精品国产一区二区三区四区阿崩 | 国产a免费 | 久久天天躁夜夜躁狠狠躁2022 | 性福利视频| 999www视频免费观看 | 四虎色视频| 草逼免费视频 | 黑人玩弄人妻中文在线 | 日韩中字在线 | 人人草在线视频 | 一级中国毛片 | 337p日本欧洲亚洲大胆张筱雨 | a级毛片国产 | 色一情一乱一乱一区99av白浆 | 日韩欧美中文字幕在线观看 | 欧美成人免费在线观看 | 国产午夜精品一区二区三 | 亚洲va在线va天堂va狼色在线 | 久久久久久久国产免费看 | 日本黄色aaa| 麻豆视频官网 | 一区二区国产盗摄色噜噜 | 祝英台艳史高h(np)小说全文 | 亚洲另类在线观看 | 国产精品美女久久久久aⅴ国产馆 | 久久免费播放视频 | 高清免费视频日本 | 午夜视频免费在线 | 亚洲成av人影院 | 四虎影视www在线播放 | 无码午夜人妻一区二区三区不卡视频 | 九九热只有精品 | 日韩黄色大片 | 成年人黄色大片大全 | 一级久久久久 | 亚洲精品午夜aaa久久久 | 在线观看视频一区 | 性视频免费的视频大全2015年 | 北条麻妃一区二区三区中文字幕 | 九九黄色 | 亚洲一区二区三区在线观看网站 | 国产亚洲人成网站在线观看 | 国产人与禽zoz0性伦 | 日本中文字幕在线视频 | 99精品国产自在现线10页 | 中文字幕日本精品一区二区三区 | 亚洲人成网站777色婷婷 | 久久亚洲网站 | 夜夜性日日交xxx性视频 | 欧美爽妇 | 69网站在线观看 | 国产曰又深又爽免费视频 | 狠狠色婷婷久久一区二区 | 处破痛哭a√18成年片免费 | 91蜜桃在线观看 | 久久精品麻豆 | 蜜桃精品免费久久久久影院 | 国产嫩草影院在线观看88 | 天堂√中文在线 | 久久99色| 精品日韩中文字幕 | 亚洲色在线无码国产精品不卡 | 97超碰免费在线 | 小蜜蜂www视频在线观看高清 | 欧美日韩 一区二区三区 | 亚洲国产精彩中文乱码av | 日韩极品视频 | 天天操婷婷 | 91精品一久久香蕉国产线看观看新通道出现 | 嫩草免费视频 | 性生活一区 | 国产大片中文字幕在线观看 | 亚洲精品乱码久久久久久麻豆不卡 | 一区二区三区欧美在线观看 | 亚洲网站在线 | 国产乱淫av片免费看 | 欧美jizzhd精品欧美丰满 | jizz欧美性23 | 亚洲视频精品在线观看 | a∨变态另类天堂无码专区 人妻丰满熟妇av无码区不卡 | 女神西比尔av在线播放 | 色综合中文字幕 | 国产精品二 | 精品人妻无码区二区三区 | 日韩欧美久久 | 天天摸天天操天天射 | 成人国产精品视频国产 | 婷婷色影院 | 亚洲va欧洲va国产va不卡 | 久久国产精品久久喷水 | 夜夜躁狠狠躁日日躁202小说 | 岛国裸体写真hd在线 | 亚洲老妈激情一区二区三区 | 成年网站在线播放 | 后进极品白嫩翘臀在线播放 | 91精品久久久久久久久久 | 色哟哟一区二区三区精华液 | 天堂а√在线中文在线 | 国产精品视频久久久久久久 | 在线视频亚洲色图 | 拔擦8x成人一区二区三区 | 在线观看免费福利 | 五月天激情电影 | 日本在线视频www | 九一毛片| 永久免费精品精品永久-夜色 | 九九热在线免费观看 | 国内精品国产成人国产三级粉色 | 国产精品秘入口18禁麻豆免会员 | 国产多p混交群体交乱 | 国产中文字字幕乱码无限 | 公妇借种乱h中文字幕 | 国内精品久久久久久久日韩 | 亚洲浮力影院久久久久久 | 成人免费网址 | 无码人妻av一区二区三区蜜臀 | 99精品欧美一区二区三区综合在线 | 日本另类视频 | 色综合天天天天做夜夜夜夜做 | 日韩欧美爱爱 | 亚洲免费高清 | 九九综合va免费看 | 日韩乱论 | 成年18网站免费进入夜色 | 欧美顶级少妇做爰hd | 欧美数码高清视频 | 国产男女无遮挡猛进猛出 | 色噜噜亚洲精品中文字幕 | 99精品国产aⅴ | 欧美成人在线影院 | 女教师少妇高潮免费 | 男人激烈吮乳吃奶爽文 | 亚洲视频国产精品 | 奇米四色在线观看 | 少妇精品视频 | 被黑人猛躁10次高潮视频 | 中文字幕无码不卡在线 | 欧洲美女毛片 | 人妻系列无码专区av在线 | 一区二区三区中文字幕在线观看 | 人人摸人人搞人人透 | 少妇午夜三级伦理影院播放器 | 香蕉视频一区二区 | 午夜免费看片 | 宅男噜噜66国产精品观看 | 最新日韩中文字幕 | 日本在线成人 | 喷水一区二区 | 深夜福利啪啪片 | 特级黄色片免费看 | 久久精品国产一区二区三区肥胖 | 国产精品18久久久久久久 | 麻豆射区| 国产女人的高潮大叫毛片 | 精品久久久久久久久久久 | 狠狠激情| 狠狠躁夜夜躁人人爽超碰91 | wwwcom在线观看| 亚洲成人av中文字幕 | √天堂资源在线中文8在线最新版 | 国产青青在线 | 老妇女性较大毛片 | 日韩免费观看av | 136av福利视频导航入口 | 丰满放荡岳乱妇91www | 国产福利社 | 国产xxxx做受视频 | 四虎少妇做爰免费视频网站四 | 综合久久国产九一剧情麻豆 | 亚洲色精品三区二区一区 | 亚洲精品色午夜无码专区日韩 | 午夜激情影院在线观看 | 久国产视频 | 久久精品超碰 | 日韩视频网站在线观看 | 国产精品久久免费观看spa | 欧美成人免费全部 | 国内精品免费视频 | 国产精品爽爽久久 | www.在线观看麻豆 | 久久久精品一区 | 一级激情片 | 97视频精品 | 啪啪tv网站免费入口 | 国产精品高清一区二区 | 久久久免费看 | 韩漫动漫免费大全在线观看 | 国产影视一区 | 国产丰满天美videossex | 国产男女猛烈无遮挡免费视频网站 | 一本加勒比hezyo无码资源网 | 成人乱码一区二区三区av | 三级特黄 | 亚洲人成无码网站久久99热国产 | 九九精品在线播放 | 久久精品4 | 人人揉人人 | 国产丝袜在线观看视频 | 国产青青草视频 | 国产日产久久高清欧美 | 亚洲国产综合在线 | 怡红院成永久免费人全部视频 | 天天骑夜夜操 | 人妻互换一二三区激情视频 | 久久香蕉国产 | 大奶子在线 | 天天躁夜夜躁狠狠综合 | 99精品在线| 韩日av免费| 成人做爰免费视频免费看 | 丁香综合激情 | 伊人网在线视频 | 亚洲精品久久久久999中文字幕 | 自拍偷拍色 | 亚洲成a人片77777kkkk1在线观看 | 日韩欧美中文字幕在线播放 | 人综合久合合 | 先锋av网 | 少妇特殊按摩高潮惨叫无码 | 在线视频免费观看你懂的 | 久久资源365 | 狠狠色网 | 伊人精品视频在线观看 | 亚洲男人第一网站 | 91网在线播放 | 亚洲午夜久久久精品一区二区三剧 | 图片区 小说区 区 亚洲五月 | 丁香婷婷激情国产高清秒播 | www.色婷婷| 精品国产欧美一区二区三区不卡 | 377p日本欧洲亚洲大胆张筱雨 | 无码性午夜视频在线观看 | 人人搞人人干 | 日日操日日射 | 亚洲综合久| 国产精品高清网站 | 欧美天天影院 | 久久免费观看视频 | 红花成人网 | 亚洲一区二区在线免费 | 久久精品一区 | 中国精品18videosex性中国 | 中文幕无线码中文字蜜桃 | 色婷婷av99xx | 国产精品乱码高清在线观看 | 亚洲精品无码专区 | 国产午夜无码视频在线观看 | 逼逼av网站 | 精品无码久久久久久国产 | 午夜一二三区 | 99在线观看免费 | www.国产成人| 亚洲成人久久精品 | 九九九久久久久 | 99re免费视频 | 日韩深夜福利 | 中文字幕热久久久久久久 | 一本色道久久99精品综合蜜臀 | 欧美成人精品高清视频在线观看 | 久久天天躁狠狠躁夜夜97 | 日本无遮挡吸乳视频 | 色狠狠av老熟女 | 手机av免费观看 | 在线看成人 | 国产在线精品一区二区三区不卡 | 国产精品人妻系列21p | 91精品无人区卡一卡二卡三 | 国产xxxx搡xxxxx搡麻豆 | 欧美成人网视频 | 男女晚上黄羞羞视频播放 | 女同一区 | 国产在线精品一区二区三区直播 | av免费网 | 色橹橹欧美在线观看视频高清 | 国产一区二区三区网站 | 中文字幕+乱码+中文乱码91 | 久久中文字幕网 | 男女黄色又爽大片 | 在线精品视频免费观看 | 亚洲男人第一av网站 | 欧美一二区 | 成人国产精品久久久 | av不卡中文字幕 | 上司人妻互换hd无码 | 亚洲免费av网站 | 国内精品久久久久久久日韩 | 亚洲成人av在线 | 亚洲天堂欧美在线 | 欧美激情综合五月色丁香小说 | 99综合网 | 国产精品久久久久久久久久99 | 秋霞福利视频 | 久久精品视频久久 | 国产香蕉视频在线播放 | 国产中文字幕在线 | 国内精品久久久久久久影视 | xvideos亚洲网站入口 | 国产精品videossex国产高清 | 日批网站在线观看 | 国产一级做a爰片在线看免费 | 欧美性黑人极品hd | 观看av| 欧美黄绝喷潮片 | 999久久久久 | 91丨九色丨蝌蚪丨对白 | 日本丰满妇人成熟免费中文字幕 | 男人j进入女人j内部免费网站 | 亚洲精品免费在线视频 | 中文字幕av一区 | av av片在线看 | 色中色综合网 | 亚洲第一页综合 | 国产一区二区三区在线看 | 欧洲美熟女乱又伦av | 红杏亚洲影院一区二区三区 | 国产精品国产精品国产专区不蜜 | 亚洲 欧美变态 另类 综合 | 欧美性生交大片18禁止 | 一区二区三区在线免费 | 久久夜色撩人精品国产av | 四虎视频在线精品免费网址 | 老女人丨91丨九色 | 性按摩玩人妻hd中文字幕 | 久久在线精品 | 一本加勒比hezyo无码资源网 | 777午夜福利理论电影网 | 国产91在线观看丝袜 | 性少妇中国内射xxxx狠干 | www国产在线观看 | 顶弄h校园1v1| 美女视频黄的全免费视频网站 | 亚洲精品国产精品乱码不99按摩 | 欧美少妇一区 | 天天摸天天做天天爽水多 | 久久久久成人精品 | 高清无码视频直接看 | 午夜av影院 | 99国产精品视频免费观看一公开 | 欧美日本韩国亚洲 | 污污网站在线 | 性感美女一区二区三区 | 超碰在线a | 国产精品久久久久久久 | 国产精品久久久久久久久久10秀 | 日韩一区二区视频 | 国产98在线传媒麻豆有限公司 | 日本又紧又色又嫩又爽的视频 | 国产精品久久一区二区三区 | 欧美噜噜噜 | 久久成人18免费网站 | 欧美无专区 | 欧美黑人乱大交 | 丰满少妇小早川怜子影片了 | 国产成人免费网站 | 国产欧美一区二区精品性色超碰 | 亚洲乱码日产精品bd在线观看 | 国产一卡二卡在线 | 两人做人爱费视频午夜 | 嫩模啪啪| 91九色国产视频 | 爱的色放3 | 成人av网页| 日日夜夜亚洲 | 肉大榛一进一出免费视频 | 椎名由奈一区二区在线 | 欧美丰满熟妇xxxx性 | 欧美偷窥清纯综合图区 | 51久久夜色精品国产麻豆 | 日韩不卡毛片 | 久久亚洲精中文字幕冲田杏梨 | 国产这里只有精品 | 国产粉嫩一区二区三区 | 调教一区 | 亚洲精品久久久久中文第一幕 | 91在线欧美 | 欧美成人做爰大片免费看黄石 | 亚洲人成电影在线观看影院 | 精品一区二区三区视频 | 91精品入口 | 黄色日韩| 在线观看一区二区三区视频 | 嫩草影院久久 | 久久国产视频一区二区 | 91精品婷婷国产综合久久蝌蚪 | 丰满少妇被猛烈进av毛片 | 国产成人手机高清在线观看网站 | 可乐操亚洲 | 无套内谢丰满少妇中文字幕 | 久久久www成人免费毛片女 | 加勒比色综合久久久久久久久 | 国产二级一片内射视频插放 | 白嫩丰满少妇xxxxx性张津瑜 | 午夜视频在线观看视频 | 色图社区 | 色屁屁草草影院ccyycom | 无码国产精成人午夜视频一区二区 | 国精品人妻无码一区免费视频电影 | 无码国模国产在线观看 | 91成人精品一区在线播放69 | 中文字幕av一区二区三区人妻少妇 | 国产 欧美 视频一区二区三区 | 91重口免费版| 999热精品 | 国色天香一卡2卡三卡4卡乱码 | 色播av| 另类天堂网 | 三级全黄裸体 | 少妇精品一区二区 | 婷婷综合少妇啪啪喷水 | 日韩第八页 | 日本中文视频 | 久久综合五月丁香久久激情 | 欧美日韩综合在线观看 | 精一区二区 | 在线超碰 | 日本成人不卡 | 久久频这里精品99香蕉 | 成人在线视频在线观看 | 天天搞夜夜爽 | 国产精品欧美一区二区三区奶水 | 黄色尤物视频 | 久久国产欧美日韩精品图片 | 激情综合五月天 | 国产大片一区二区三区 | 在线不卡一区 | 亚洲欧洲综合网 | 91精品国产综合久久福利 | 一本色道久久88综合日韩精品 | 免费中文熟妇在线影片 | 久久精品国产99国产精品导航 | 亚洲中文字幕无码一区在线 | 亚洲精品成人久久久 | 人妻av中文系列 | 成人自拍视频网站 | 午夜一区二区三区四区 | 日韩成人一区二区三区在线观看 | 午夜激情视频网 | 妇欲欢公爽公妇高h苏晴 | 成人片黄网站色大片免费毛片 | 五月天精品一区二区三区 | 性感少妇av| 亚洲国产成人久久精品软件 | 日韩av不卡一区 | 性少妇videosexfre | 久草在线新时代的视觉体验 | 中文字幕制服狠久久日韩二区 | 国产 剧情 在线 精品 | 国产精品18hdxxxⅹ在线 | 中文在线观看av | 内射中出日韩无国产剧情 | jlzzjlzz亚洲日本少妇 | 精品偷拍被偷拍在线观看 | 久久久久久久久免费视频 | 亚洲小说图区综合在线 | 色五月丁香五月综合五月4438 | 欧美人在线 | 红杏亚洲影院一区二区三区 | 国产中文字幕乱人伦在线观看 | 人妻丰满熟妇aⅴ无码 | 精品国产三级a∨在线 | xxxxx欧美妇科医生检查 | 中文字字幕在线中文无码 | 青青久草网| 免费av播放 | 亚洲一区二区在线看 | 亚洲天堂av免费在线观看 | 欧美视频一区二区 | 亚洲熟妇av一区二区三区浪潮 | 欧美久久精品 | 少妇扒开双腿自慰出白浆 | 久国久产久精永久网页 | 精品无码一区在线观看 | 777色婷婷视频二三区 | 久久精品一二区 | 国产黄色大片视频 | 少妇特殊按摩高潮惨叫无码 | 色666| 狠狠躁夜夜躁人人躁婷婷91 | 久久亚洲色一区二区三区 | 国产精品最新乱视频二区 | 看黄色小视频 | 日本中文字幕在线观看视频 | 精品人妻一区二区三区浪潮在线 | 亚洲小说网 | 亚洲无圣光 | 久久99国产综合精品免费 | 午夜黄视频| 欧美日韩国语 | 波多野结衣av高清一区二区三区 | 亚洲色成人网站www永久男男 | 神马午夜麻豆 | 成年女人a毛片免费视频 | 日韩人妻中文无码一区二区七区 | 免费观看久久久 | 69av在线播放 | 图片区偷拍区小说区 | 国产成人无码专区 | 综合国产视频 | 西西人体444www大胆无码视频 | 久久久久人妻一区二区三区 | youjizzcom中国少妇 | 国产精品专区在线 | 在线视频天堂 | 国内精品久久久久久久影视蜜臀 | 亚洲午夜视频在线观看 | 欧洲视频一区 | 可以在线观看的av网站 | 中文字幕校园春色 | 岛国片在线播放97 | av在线播放免费 | 亚洲欧洲免费视频 | www.欧美在线观看 | 国语做受对白xxxxx在线 | 特级a老妇做爰全过程 | 国产黄网在线观看 | 中文字幕精品久久久乱码乱码 | 中文字幕在线看片 | 在线观看视频中文字幕 | 色屁屁www影院免费观看 | 一区二区三区小说 | 国产女人高潮抽搐叫床涩爱小说 | 在线观看欧美亚洲 | 日本成人在线播放 | 性欧美长视频免费观看不卡 | av网站的免费观看 | 高清人人天天夜夜曰狠狠狠狠 | 狠狠老司机 | 欲妇荡岳丰满少妇岳 |