From a9a83a1c26c59755787999710b4cebf15eee7616 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Thu, 18 Jun 2015 11:53:40 +0300 Subject: [PATCH 01/19] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3754363..606f2ca 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ Tree view implementation for android + ### Integration From 185fb1cf612c5844ced7e3c1a3e4f305a2bf2c9d Mon Sep 17 00:00:00 2001 From: mathiasberwig Date: Tue, 1 Sep 2015 10:56:09 -0300 Subject: [PATCH 02/19] added long click listener to treeview and folder structure example --- .../fragment/FolderStructureFragment.java | 9 ++++++++ .../com/unnamed/b/atv/model/TreeNode.java | 21 +++++++++++++++---- .../unnamed/b/atv/view/AndroidTreeView.java | 19 +++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java b/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java index dc55f1a..49ca252 100644 --- a/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java +++ b/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java @@ -67,6 +67,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa tView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom); tView.setDefaultViewHolder(IconTreeItemHolder.class); tView.setDefaultNodeClickListener(nodeClickListener); + tView.setDefaultNodeLongClickListener(nodeLongClickListener); containerView.addView(tView.getView()); @@ -119,6 +120,14 @@ public void onClick(TreeNode node, Object value) { } }; + private TreeNode.TreeNodeLongClickListener nodeLongClickListener = new TreeNode.TreeNodeLongClickListener() { + @Override + public void onLongClick(TreeNode node, Object value) { + IconTreeItemHolder.IconTreeItem item = (IconTreeItemHolder.IconTreeItem) value; + Toast.makeText(getActivity(), "Long click: " + item.text, Toast.LENGTH_SHORT).show(); + } + }; + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java index 5d64af9..b16d8e5 100644 --- a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java +++ b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java @@ -25,7 +25,8 @@ public class TreeNode { private boolean mSelectable = true; private final List children; private BaseNodeViewHolder mViewHolder; - private TreeNodeClickListener mListener; + private TreeNodeClickListener mClickListener; + private TreeNodeLongClickListener mLongClickListener; private Object mValue; private boolean mExpanded; @@ -169,13 +170,21 @@ public TreeNode setViewHolder(BaseNodeViewHolder viewHolder) { } public TreeNode setClickListener(TreeNodeClickListener listener) { - mListener = listener; + mClickListener = listener; return this; } - public TreeNodeClickListener getClickListener() { - return this.mListener; + return this.mClickListener; + } + + public TreeNode setLongClickListener(TreeNodeLongClickListener listener) { + mLongClickListener = listener; + return this; + } + + public TreeNodeLongClickListener getLongClickListener() { + return mLongClickListener; } public BaseNodeViewHolder getViewHolder() { @@ -206,6 +215,10 @@ public interface TreeNodeClickListener { void onClick(TreeNode node, Object value); } + public interface TreeNodeLongClickListener { + void onLongClick(TreeNode node, Object value); + } + public static abstract class BaseNodeViewHolder { protected AndroidTreeView tView; protected TreeNode mNode; diff --git a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java index 8c731da..0d596ce 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java @@ -32,6 +32,7 @@ public class AndroidTreeView { private int containerStyle = 0; private Class defaultViewHolderClass = SimpleViewHolder.class; private TreeNode.TreeNodeClickListener nodeClickListener; + private TreeNode.TreeNodeLongClickListener nodeLongClickListener; private boolean mSelectionModeEnabled; private boolean mUseDefaultAnimation = false; private boolean use2dScroll = false; @@ -70,6 +71,10 @@ public void setDefaultNodeClickListener(TreeNode.TreeNodeClickListener listener) nodeClickListener = listener; } + public void setDefaultNodeLongClickListener(TreeNode.TreeNodeLongClickListener listener) { + nodeLongClickListener = listener; + } + public void expandAll() { expandNode(mRoot, true); } @@ -250,6 +255,20 @@ public void onClick(View v) { toggleNode(n); } }); + + nodeView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + if (n.getLongClickListener() != null) { + n.getLongClickListener().onLongClick(n, n.getValue()); + return true; + } else if (nodeLongClickListener != null) { + nodeLongClickListener.onLongClick(n, n.getValue()); + return true; + } + return false; + } + }); } From 125033b6a2420fb954a90ed62ccbe3809969e2fd Mon Sep 17 00:00:00 2001 From: mathiasberwig Date: Tue, 1 Sep 2015 13:44:49 -0300 Subject: [PATCH 03/19] added long click listener to treeview and folder structure example --- .../main/java/com/unnamed/b/atv/view/AndroidTreeView.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java index 0d596ce..b56e138 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java @@ -260,11 +260,9 @@ public void onClick(View v) { @Override public boolean onLongClick(View view) { if (n.getLongClickListener() != null) { - n.getLongClickListener().onLongClick(n, n.getValue()); - return true; + return n.getLongClickListener().onLongClick(n, n.getValue()); } else if (nodeLongClickListener != null) { - nodeLongClickListener.onLongClick(n, n.getValue()); - return true; + return nodeLongClickListener.onLongClick(n, n.getValue()); } return false; } From 5fbcb2c86df2e1577034940d5e84244618a58135 Mon Sep 17 00:00:00 2001 From: mathiasberwig Date: Tue, 1 Sep 2015 13:45:39 -0300 Subject: [PATCH 04/19] added long click listener to treeview and folder structure example --- library/src/main/java/com/unnamed/b/atv/model/TreeNode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java index b16d8e5..14958f1 100644 --- a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java +++ b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java @@ -216,7 +216,7 @@ public interface TreeNodeClickListener { } public interface TreeNodeLongClickListener { - void onLongClick(TreeNode node, Object value); + boolean onLongClick(TreeNode node, Object value); } public static abstract class BaseNodeViewHolder { From a9799b698c193985145df918818decd960950722 Mon Sep 17 00:00:00 2001 From: Mathias Berwig Date: Mon, 14 Sep 2015 11:34:01 -0300 Subject: [PATCH 05/19] improved id generation. fix #20 --- .../src/main/java/com/unnamed/b/atv/model/TreeNode.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java index 14958f1..315288c 100644 --- a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java +++ b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java @@ -20,6 +20,7 @@ public class TreeNode { public static final String NODES_ID_SEPARATOR = ":"; private int mId; + private int mLastId; private TreeNode mParent; private boolean mSelected; private boolean mSelectable = true; @@ -36,6 +37,10 @@ public static TreeNode root() { return root; } + private int generateId() { + return ++mLastId; + } + public TreeNode(Object value) { children = new ArrayList<>(); mValue = value; @@ -43,8 +48,7 @@ public TreeNode(Object value) { public TreeNode addChild(TreeNode childNode) { childNode.mParent = this; - //TODO think about id generation - childNode.mId = size(); + childNode.mId = generateId(); children.add(childNode); return this; } From fcc7e72f9911e591cee5a17a361d54f0ccf925b1 Mon Sep 17 00:00:00 2001 From: Mathias Berwig Date: Mon, 14 Sep 2015 11:35:40 -0300 Subject: [PATCH 06/19] removed redundant array creation --- .../src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java index b56e138..7234208 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java @@ -269,7 +269,6 @@ public boolean onLongClick(View view) { }); } - //------------------------------------------------------------ // Selection methods @@ -376,7 +375,7 @@ private TreeNode.BaseNodeViewHolder getViewHolderForNode(TreeNode node) { TreeNode.BaseNodeViewHolder viewHolder = node.getViewHolder(); if (viewHolder == null) { try { - final Object object = defaultViewHolderClass.getConstructor(Context.class).newInstance(new Object[]{mContext}); + final Object object = defaultViewHolderClass.getConstructor(Context.class).newInstance(mContext); viewHolder = (TreeNode.BaseNodeViewHolder) object; node.setViewHolder(viewHolder); } catch (Exception e) { From 223a2d056706ef6374fa7bc5d3f318c61642a564 Mon Sep 17 00:00:00 2001 From: Mathias Berwig Date: Mon, 14 Sep 2015 11:36:36 -0300 Subject: [PATCH 07/19] simplified statement --- library/src/main/java/com/unnamed/b/atv/model/TreeNode.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java index 315288c..dbf33f8 100644 --- a/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java +++ b/library/src/main/java/com/unnamed/b/atv/model/TreeNode.java @@ -115,11 +115,7 @@ public void setSelected(boolean selected) { } public boolean isSelected() { - if (mSelectable) { - return mSelected; - } else { - return false; - } + return mSelectable && mSelected; } public void setSelectable(boolean selectable) { From d48cbc6539b4f3236c03a3d1f3b225489e8064b5 Mon Sep 17 00:00:00 2001 From: Mathias Berwig Date: Mon, 14 Sep 2015 11:39:10 -0300 Subject: [PATCH 08/19] corrected return type to match interface --- .../b/atv/sample/fragment/FolderStructureFragment.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java b/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java index 49ca252..a59790c 100644 --- a/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java +++ b/app/src/main/java/com/unnamed/b/atv/sample/fragment/FolderStructureFragment.java @@ -78,7 +78,6 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } } - return rootView; } @@ -122,9 +121,10 @@ public void onClick(TreeNode node, Object value) { private TreeNode.TreeNodeLongClickListener nodeLongClickListener = new TreeNode.TreeNodeLongClickListener() { @Override - public void onLongClick(TreeNode node, Object value) { + public boolean onLongClick(TreeNode node, Object value) { IconTreeItemHolder.IconTreeItem item = (IconTreeItemHolder.IconTreeItem) value; Toast.makeText(getActivity(), "Long click: " + item.text, Toast.LENGTH_SHORT).show(); + return true; } }; From 839ee2fc9386b81d8711c8c3a41e6bfdf6c01ab5 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Thu, 24 Sep 2015 10:17:19 +0300 Subject: [PATCH 09/19] Version updated --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6bb8610..ec56e5c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.2.5 -VERSION_CODE=7 +VERSION_NAME=1.2.6 +VERSION_CODE=8 ANDROID_BUILD_MIN_SDK_VERSION=11 From 7e61bd9afee2f1eda453b337c29bc57d6c9e4e0c Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Thu, 24 Sep 2015 10:28:19 +0300 Subject: [PATCH 10/19] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 606f2ca..30aac26 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,12 @@ Tree view implementation for android + 4. Selection mode for nodes + 5. Dynamic add/remove node +### Known Limitations ++ For Android 4.0 (+/- nearest version) if you have too deep view hierarchy and with tree its easily possible, your app may crash + +
+
+ From 3927d0d61b8103e799823c41e5b4877162639d5c Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Thu, 5 Nov 2015 12:58:06 +0200 Subject: [PATCH 11/19] #38 removed allowBackup in library --- gradle.properties | 4 ++-- library/src/main/AndroidManifest.xml | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index ec56e5c..87aebb0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.2.6 -VERSION_CODE=8 +VERSION_NAME=1.2.7 +VERSION_CODE=9 ANDROID_BUILD_MIN_SDK_VERSION=11 diff --git a/library/src/main/AndroidManifest.xml b/library/src/main/AndroidManifest.xml index 5e40d2f..0dec550 100644 --- a/library/src/main/AndroidManifest.xml +++ b/library/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + - + From 5948d4d4a58f5ca070900b15cd1db5eea898e8ab Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Mon, 28 Dec 2015 14:10:22 +0200 Subject: [PATCH 12/19] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 30aac26..eac8970 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Tree view implementation for android [![AndroidTreeView Demo on Google Play Store](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=com.unnamed.b.atv.demo) -### Featrues +### Features + 1. N - level expandable/collapsable tree + 2. Custom values, views, styles for nodes + 3. Save state after rotation From ea56075d0ce3a5790a62a4d867f1fabe915dbaae Mon Sep 17 00:00:00 2001 From: Ye He Date: Fri, 22 Jan 2016 14:43:43 +1100 Subject: [PATCH 13/19] Expose fields for subclass. --- .../java/com/unnamed/b/atv/view/AndroidTreeView.java | 10 +++++++++- .../com/unnamed/b/atv/view/TreeNodeWrapperView.java | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java index 7234208..d56241a 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java @@ -26,7 +26,7 @@ public class AndroidTreeView { private static final String NODES_PATH_SEPARATOR = ";"; - private TreeNode mRoot; + protected TreeNode mRoot; private Context mContext; private boolean applyForRoot; private int containerStyle = 0; @@ -37,6 +37,14 @@ public class AndroidTreeView { private boolean mUseDefaultAnimation = false; private boolean use2dScroll = false; + public AndroidTreeView(Context context) { + mContext = context; + } + + public void setRoot(TreeNode mRoot) { + this.mRoot = mRoot; + } + public AndroidTreeView(Context context, TreeNode root) { mRoot = root; mContext = context; diff --git a/library/src/main/java/com/unnamed/b/atv/view/TreeNodeWrapperView.java b/library/src/main/java/com/unnamed/b/atv/view/TreeNodeWrapperView.java index 21f7362..b660563 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/TreeNodeWrapperView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/TreeNodeWrapperView.java @@ -46,4 +46,7 @@ public void insertNodeView(View nodeView) { nodeContainer.addView(nodeView); } + public ViewGroup getNodeContainer() { + return nodeContainer; + } } From e0fd5bc741ec8b8a57c566182269b3b908242f58 Mon Sep 17 00:00:00 2001 From: SzigetiPeter Date: Tue, 2 Feb 2016 11:44:39 +0200 Subject: [PATCH 14/19] Added disable for auto tree node toggle, and test use case --- .../b/atv/sample/activity/MainActivity.java | 2 + .../TwoDScrollingArrowExpandFragment.java | 82 +++++++++++++++++++ .../ArrowExpandSelectableHeaderHolder.java | 74 +++++++++++++++++ .../unnamed/b/atv/view/AndroidTreeView.java | 18 +++- 4 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/unnamed/b/atv/sample/fragment/TwoDScrollingArrowExpandFragment.java create mode 100644 app/src/main/java/com/unnamed/b/atv/sample/holder/ArrowExpandSelectableHeaderHolder.java diff --git a/app/src/main/java/com/unnamed/b/atv/sample/activity/MainActivity.java b/app/src/main/java/com/unnamed/b/atv/sample/activity/MainActivity.java index 4029a26..f74bea2 100644 --- a/app/src/main/java/com/unnamed/b/atv/sample/activity/MainActivity.java +++ b/app/src/main/java/com/unnamed/b/atv/sample/activity/MainActivity.java @@ -13,6 +13,7 @@ import com.unnamed.b.atv.sample.fragment.CustomViewHolderFragment; import com.unnamed.b.atv.sample.fragment.FolderStructureFragment; import com.unnamed.b.atv.sample.fragment.SelectableTreeFragment; +import com.unnamed.b.atv.sample.fragment.TwoDScrollingArrowExpandFragment; import com.unnamed.b.atv.sample.fragment.TwoDScrollingFragment; import java.util.ArrayList; @@ -34,6 +35,7 @@ protected void onCreate(Bundle savedInstanceState) { listItems.put("Custom Holder Example", CustomViewHolderFragment.class); listItems.put("Selectable Nodes", SelectableTreeFragment.class); listItems.put("2d scrolling", TwoDScrollingFragment.class); + listItems.put("Expand with arrow only", TwoDScrollingArrowExpandFragment.class); final List list = new ArrayList(listItems.keySet()); diff --git a/app/src/main/java/com/unnamed/b/atv/sample/fragment/TwoDScrollingArrowExpandFragment.java b/app/src/main/java/com/unnamed/b/atv/sample/fragment/TwoDScrollingArrowExpandFragment.java new file mode 100644 index 0000000..bc64194 --- /dev/null +++ b/app/src/main/java/com/unnamed/b/atv/sample/fragment/TwoDScrollingArrowExpandFragment.java @@ -0,0 +1,82 @@ +package com.unnamed.b.atv.sample.fragment; + +import android.app.Fragment; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import com.unnamed.b.atv.model.TreeNode; +import com.unnamed.b.atv.sample.R; +import com.unnamed.b.atv.sample.holder.ArrowExpandSelectableHeaderHolder; +import com.unnamed.b.atv.sample.holder.IconTreeItemHolder; +import com.unnamed.b.atv.view.AndroidTreeView; + +/** + * Created by Bogdan Melnychuk on 2/12/15 modified by Szigeti Peter 2/2/16. + */ +public class TwoDScrollingArrowExpandFragment extends Fragment implements TreeNode.TreeNodeClickListener{ + private static final String NAME = "Very long name for folder"; + private AndroidTreeView tView; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View rootView = inflater.inflate(R.layout.fragment_selectable_nodes, null, false); + rootView.findViewById(R.id.status).setVisibility(View.GONE); + ViewGroup containerView = (ViewGroup) rootView.findViewById(R.id.container); + + TreeNode root = TreeNode.root(); + + TreeNode s1 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Folder with very long name ")).setViewHolder( + new ArrowExpandSelectableHeaderHolder(getActivity())); + TreeNode s2 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Another folder with very long name")).setViewHolder( + new ArrowExpandSelectableHeaderHolder(getActivity())); + + fillFolder(s1); + fillFolder(s2); + + root.addChildren(s1, s2); + + tView = new AndroidTreeView(getActivity(), root); + tView.setDefaultAnimation(true); + tView.setUse2dScroll(true); + tView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom); + tView.setDefaultNodeClickListener(TwoDScrollingArrowExpandFragment.this); + tView.setDefaultViewHolder(ArrowExpandSelectableHeaderHolder.class); + containerView.addView(tView.getView()); + tView.setUseAutoToggle(false); + + tView.expandAll(); + + if (savedInstanceState != null) { + String state = savedInstanceState.getString("tState"); + if (!TextUtils.isEmpty(state)) { + tView.restoreState(state); + } + } + return rootView; + } + + private void fillFolder(TreeNode folder) { + TreeNode currentNode = folder; + for (int i = 0; i < 4; i++) { + TreeNode file = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, NAME + " " + i)); + currentNode.addChild(file); + currentNode = file; + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putString("tState", tView.getSaveState()); + } + + @Override + public void onClick(TreeNode node, Object value) { + Toast toast = Toast.makeText(getActivity(), ((IconTreeItemHolder.IconTreeItem)value).text, Toast.LENGTH_SHORT); + toast.show(); + } +} diff --git a/app/src/main/java/com/unnamed/b/atv/sample/holder/ArrowExpandSelectableHeaderHolder.java b/app/src/main/java/com/unnamed/b/atv/sample/holder/ArrowExpandSelectableHeaderHolder.java new file mode 100644 index 0000000..c58d084 --- /dev/null +++ b/app/src/main/java/com/unnamed/b/atv/sample/holder/ArrowExpandSelectableHeaderHolder.java @@ -0,0 +1,74 @@ +package com.unnamed.b.atv.sample.holder; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.TextView; + +import com.github.johnkil.print.PrintView; +import com.unnamed.b.atv.model.TreeNode; +import com.unnamed.b.atv.sample.R; + +/** + * Created by Bogdan Melnychuk on 2/15/15, modified by Szigeti Peter 2/2/16. + */ +public class ArrowExpandSelectableHeaderHolder extends TreeNode.BaseNodeViewHolder { + private TextView tvValue; + private PrintView arrowView; + private CheckBox nodeSelector; + + public ArrowExpandSelectableHeaderHolder(Context context) { + super(context); + } + + @Override + public View createNodeView(final TreeNode node, IconTreeItemHolder.IconTreeItem value) { + final LayoutInflater inflater = LayoutInflater.from(context); + final View view = inflater.inflate(R.layout.layout_selectable_header, null, false); + + tvValue = (TextView) view.findViewById(R.id.node_value); + tvValue.setText(value.text); + + final PrintView iconView = (PrintView) view.findViewById(R.id.icon); + iconView.setIconText(context.getResources().getString(value.icon)); + + arrowView = (PrintView) view.findViewById(R.id.arrow_icon); + arrowView.setPadding(20,10,10,10); + if (node.isLeaf()) { + arrowView.setVisibility(View.GONE); + } + arrowView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + tView.toggleNode(node); + } + }); + + nodeSelector = (CheckBox) view.findViewById(R.id.node_selector); + nodeSelector.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + node.setSelected(isChecked); + for (TreeNode n : node.getChildren()) { + getTreeView().selectNode(n, isChecked); + } + } + }); + nodeSelector.setChecked(node.isSelected()); + + return view; + } + + @Override + public void toggle(boolean active) { + arrowView.setIconText(context.getResources().getString(active ? R.string.ic_keyboard_arrow_down : R.string.ic_keyboard_arrow_right)); + } + + @Override + public void toggleSelectionMode(boolean editModeEnabled) { + nodeSelector.setVisibility(editModeEnabled ? View.VISIBLE : View.GONE); + nodeSelector.setChecked(mNode.isSelected()); + } +} diff --git a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java index d56241a..222a43a 100644 --- a/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java +++ b/library/src/main/java/com/unnamed/b/atv/view/AndroidTreeView.java @@ -36,6 +36,7 @@ public class AndroidTreeView { private boolean mSelectionModeEnabled; private boolean mUseDefaultAnimation = false; private boolean use2dScroll = false; + private boolean enableAutoToggle = true; public AndroidTreeView(Context context) { mContext = context; @@ -71,6 +72,14 @@ public boolean is2dScrollEnabled() { return use2dScroll; } + public void setUseAutoToggle(boolean enableAutoToggle) { + this.enableAutoToggle = enableAutoToggle; + } + + public boolean isAutoToggleEnabled() { + return enableAutoToggle; + } + public void setDefaultViewHolder(Class viewHolder) { defaultViewHolderClass = viewHolder; } @@ -194,7 +203,7 @@ private void getSaveState(TreeNode root, StringBuilder sBuilder) { } } - private void toggleNode(TreeNode node) { + public void toggleNode(TreeNode node) { if (node.isExpanded()) { collapseNode(node, false); } else { @@ -260,7 +269,9 @@ public void onClick(View v) { } else if (nodeClickListener != null) { nodeClickListener.onClick(n, n.getValue()); } - toggleNode(n); + if (enableAutoToggle) { + toggleNode(n); + } } }); @@ -272,6 +283,9 @@ public boolean onLongClick(View view) { } else if (nodeLongClickListener != null) { return nodeLongClickListener.onLongClick(n, n.getValue()); } + if (enableAutoToggle) { + toggleNode(n); + } return false; } }); From 44fff00b2a15e33d9bb1f61f6ad947ea1f0609c9 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Fri, 12 Feb 2016 10:51:07 +0200 Subject: [PATCH 15/19] Update README.md Google play image updated --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index eac8970..e95a170 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Tree view implementation for android ### Demo -[![AndroidTreeView Demo on Google Play Store](http://developer.android.com/images/brand/en_generic_rgb_wo_60.png)](https://play.google.com/store/apps/details?id=com.unnamed.b.atv.demo) +[![AndroidTreeView Demo on Google Play Store](http://style.anu.edu.au/_anu/images/icons/icon-google-play-small.png)](https://play.google.com/store/apps/details?id=com.unnamed.b.atv.demo) ### Features From 5a015a1281ad995184ab310bf1dfdc260b974e12 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Fri, 12 Feb 2016 11:07:02 +0200 Subject: [PATCH 16/19] Update README.md --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index e95a170..89074e2 100644 --- a/README.md +++ b/README.md @@ -105,12 +105,6 @@ AndroidTreeView.setDefaultNodeClickListener For more details use sample application as example -### Upcoming changes - -**1)** Horizontal scroll issue - -**2)** Add wiki? - Let me know if i missed something, appreciate your support, thanks! ### Projects using this library From 654856509eb4e12ad241fd43cd4f3edd600c2f07 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Mon, 25 Apr 2016 17:12:50 +0200 Subject: [PATCH 17/19] version updated --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 87aebb0..3cff844 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.2.7 -VERSION_CODE=9 +VERSION_NAME=1.2.8 +VERSION_CODE=10 ANDROID_BUILD_MIN_SDK_VERSION=11 From d051ce75f5c9bd5206481808f6133b51f581c8f1 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Tue, 3 May 2016 09:31:03 +0200 Subject: [PATCH 18/19] Update gradle.properties --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 3cff844..ddb8205 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,8 +17,8 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -VERSION_NAME=1.2.8 -VERSION_CODE=10 +VERSION_NAME=1.2.9 +VERSION_CODE=11 ANDROID_BUILD_MIN_SDK_VERSION=11 @@ -36,4 +36,4 @@ POM_LICENCE_NAME=The Apache Software License, Version 2.0 POM_LICENCE_URL=http://www.apache.org/licenses/LICENSE-2.0.txt POM_LICENCE_DIST=repo POM_DEVELOPER_ID=unnamed_b -POM_DEVELOPER_NAME=Bogdan Melnychuk \ No newline at end of file +POM_DEVELOPER_NAME=Bogdan Melnychuk From 5850dc8252b94e3ce9c5f2a375dea57683b326a1 Mon Sep 17 00:00:00 2001 From: Bogdan Melnychuk Date: Wed, 9 Feb 2022 08:25:31 +0100 Subject: [PATCH 19/19] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 89074e2..d18ece8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +## This project is deprecated. You can still use it as it. Let me know if someone is interested in supporting it. + AndroidTreeView ====================