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实现多级树形列表 的全部内容, 来源链接: utcz.com/p/243610.html

回到顶部