1 packagecn.asiontang.nleveltreelistview;2
3 importandroid.annotation.TargetApi;4 importandroid.content.Context;5 importandroid.os.Build;6 importandroid.util.AttributeSet;7 importandroid.view.View;8 importandroid.widget.AdapterView;9 importandroid.widget.ListAdapter;10 importandroid.widget.ListView;11
12 /**
13 * 支持N(无限)层级的树列表结构14 *15 *
参考资料:
16 *- 17 *
- 18 * Android无限级树状结构 -19 * Android20 * - 从此网21 * 22 *
27 @SuppressWarnings("unused")28 public class NLevelTreeView extendsListView29 {30 privateOnTreeNodeClickListener mOnTreeNodeClickListener;31
32 public NLevelTreeView(finalContext context)33 {34 super(context);35 this.init();36 }37
38 public NLevelTreeView(final Context context, finalAttributeSet attrs)39 {40 super(context, attrs);41 this.init();42 }43
44 public NLevelTreeView(final Context context, final AttributeSet attrs, final intdefStyleAttr)45 {46 super(context, attrs, defStyleAttr);47 this.init();48 }49
50 @TargetApi(Build.VERSION_CODES.LOLLIPOP)51 public NLevelTreeView(final Context context, final AttributeSet attrs, final int defStyleAttr, final intdefStyleRes)52 {53 super(context, attrs, defStyleAttr, defStyleRes);54 this.init();55 }56
57 private voidinit()58 {59 }60
61 public void setAdapter(finalNLevelTreeNodeAdapter adapter)62 {63 super.setAdapter(adapter);64
65 //让 NLevelTreeNodeAdapter 处理 节点 收缩展开 动作
66 super.setOnItemClickListener(adapter);67
68 //处理当 叶子节点 被点击后的事件 回调。
69 adapter.setOuterOnItemClickListener(newOnItemClickListener()70 {71 @Override72 public void onItemClick(final AdapterView> parent, final View view, final int position, final longid)73 {74 if (NLevelTreeView.this.mOnTreeNodeClickListener != null)75 {76 final NLevelTreeNode item =(NLevelTreeNode) parent.getItemAtPosition(position);77 NLevelTreeView.this.mOnTreeNodeClickListener.onTreeNodeClick(item);78 }79 }80 });81 }82
83 /**
84 * 必须使用继承自 NLevelTreeNodeAdapter 的 适配器,否则会出现异常。85 */
86 @Override87 public void setAdapter(finalListAdapter adapter)88 {89 if (adapter instanceofNLevelTreeNodeAdapter)90 this.setAdapter((NLevelTreeNodeAdapter) adapter);91 else
92 throw new RuntimeException("For NLevelTreeView, use setAdapter(NLevelTreeNodeAdapter) instead of setAdapter(ListAdapter)");93 }94
95 /**
96 * 不支持使用此回调方式97 */
98 @Override99 @Deprecated100 public void setOnItemClickListener(finalOnItemClickListener listener)101 {102 //实际的事件回调在setAdapter里设置,由 setOnTreeNodeClickListener 处理。103 //super.setOuterOnItemClickListener(listener);
104
105 throw new RuntimeException("For NLevelTreeView, use setOnTreeNodeClickListener() instead of setOnItemClickListener()");106 }107
108 /**
109 * 默认只支持叶子节点的Click事件110 */
111 public void setOnTreeNodeClickListener(finalOnTreeNodeClickListener listener)112 {113 this.mOnTreeNodeClickListener =listener;114 }115
116 /**
117 * 默认只支持叶子节点的Click事件118 */
119 public interfaceOnTreeNodeClickListener120 {121 /**
122 * 默认只支持叶子节点的Click事件123 */
124 voidonTreeNodeClick(NLevelTreeNode node);125 }126 }