From 4b2f5e31eabf49c5a380ec0c3e36edca94e7eedd Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 27 Jun 2017 15:21:19 +0800 Subject: [PATCH 1/2] adapter: add isInitiallyExpanded method --- .../MultiLevelListAdapter.java | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java b/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java index 7f44197..6b01b89 100644 --- a/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java +++ b/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java @@ -47,7 +47,7 @@ public abstract class MultiLevelListAdapter { /** * Gets list of object's sub-items. - * + *

* Called only for expandable objects. * * @param object The object. @@ -58,13 +58,25 @@ public abstract class MultiLevelListAdapter { /** * Gets view configured to display the object. * - * @param object The object. + * @param object The object. * @param convertView The view that can be reused if possible. Null value if not available. - * @param itemInfo The InfoItem object with information about item location in MultiLevelListView. + * @param itemInfo The InfoItem object with information about item location in MultiLevelListView. * @return The view that reflects the object. */ protected abstract View getViewForObject(Object object, View convertView, ItemInfo itemInfo); + /** + * Indicates if object is expanded initially. + * You can override this method to specify different objects' behaviour. + * This method will NOT be called if {@link #isExpandable(Object)} returns false or {@link MultiLevelListView#isAlwaysExpanded()} returns true. + * + * @param object The object. + * @return true if object is expanded, false otherwise. + */ + protected boolean isInitiallyExpanded(Object object) { + return false; + } + /** * Sets initial data items to be displayed in attached MultiLevelListView. * @@ -110,7 +122,7 @@ private void checkState() { * Creates list of nodes for data items provided to adapter. * * @param dataItems List of objects for which nodes have to be created. - * @param parent Node that is a parent for nodes created for data items. + * @param parent Node that is a parent for nodes created for data items. * @return List with nodes. */ private List createNodeListFromDataItems(List dataItems, Node parent) { @@ -121,7 +133,7 @@ private List createNodeListFromDataItems(List dataItems, Node parent) { Node node = new Node(dataItem, parent); node.setExpandable(isExpandable); - if (mView.isAlwaysExpanded() && isExpandable) { + if (isExpandable && (mView.isAlwaysExpanded() || isInitiallyExpanded(dataItem))) { node.setSubNodes(createNodeListFromDataItems(getSubObjects(node.getObject()), node)); } result.add(node); @@ -145,7 +157,7 @@ private List createItemsForCurrentStat() { * Adds recurrently nodes and their sub-nodes to provided list. * * @param result Output parameter with flat list of items. - * @param nodes Nodes list. + * @param nodes Nodes list. */ private void collectItems(List result, List nodes) { if (nodes != null) { @@ -205,10 +217,10 @@ void registerView(MultiLevelListView view) { /** * Extends node. - * + *

* Adds sub-nodes to the node. * - * @param node The node. + * @param node The node. * @param nestTyp NestType value. */ void extendNode(Node node, NestType nestTyp) { @@ -221,7 +233,7 @@ void extendNode(Node node, NestType nestTyp) { /** * Collapse node. - * + *

* Clears node's sub-nodes. * * @param node The node From f23f9e53ebf01482f64e36bba412152b6b53d024 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 27 Jun 2017 15:55:37 +0800 Subject: [PATCH 2/2] sample-app: add Group 2 initially expanded option --- .../MultiLevelListAdapter.java | 2 +- .../sample/DataActivity.java | 24 ++++++++-- .../sample/data/DataProvider.java | 45 +++++++++++-------- .../src/main/res/layout/data_activity.xml | 11 +++++ sample-app/src/main/res/values/strings.xml | 1 + 5 files changed, 61 insertions(+), 22 deletions(-) diff --git a/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java b/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java index 6b01b89..5ec9d46 100644 --- a/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java +++ b/multi-level-listview/src/main/java/pl/openrnd/multilevellistview/MultiLevelListAdapter.java @@ -105,7 +105,7 @@ public void notifyDataSetChanged() { /** * Reloads data. Method is causing nodes recreation. */ - void reloadData() { + public void reloadData() { setDataItems(mSourceData); } diff --git a/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/DataActivity.java b/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/DataActivity.java index c2a6903..7cbfc94 100644 --- a/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/DataActivity.java +++ b/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/DataActivity.java @@ -44,8 +44,10 @@ public class DataActivity extends Activity { private MultiLevelListView mListView; private Switch mMultipliedExpandingView; private Switch mAlwaysExpandedView; + private Switch mInitiallyExpandedView; private boolean mAlwaysExpandend; + private ListAdapter mListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { @@ -59,19 +61,21 @@ private void confViews() { mListView = (MultiLevelListView) findViewById(R.id.listView); mMultipliedExpandingView = (Switch) findViewById(R.id.multipledExpanding); mAlwaysExpandedView = (Switch) findViewById(R.id.alwaysExpanded); + mInitiallyExpandedView = (Switch) findViewById(R.id.initiallyExpanded); mMultipliedExpandingView.setOnCheckedChangeListener(mOnCheckedChangeListener); mAlwaysExpandedView.setOnCheckedChangeListener(mOnCheckedChangeListener); + mInitiallyExpandedView.setOnCheckedChangeListener(mOnCheckedChangeListener); setAlwaysExpanded(mAlwaysExpandedView.isChecked()); setMultipleExpanding(mMultipliedExpandingView.isChecked()); - ListAdapter listAdapter = new ListAdapter(); + mListAdapter = new ListAdapter(); - mListView.setAdapter(listAdapter); + mListView.setAdapter(mListAdapter); mListView.setOnItemClickListener(mOnItemClickListener); - listAdapter.setDataItems(DataProvider.getInitialItems()); + mListAdapter.setDataItems(DataProvider.getInitialItems()); } private void setAlwaysExpanded(boolean alwaysExpanded) { @@ -83,6 +87,12 @@ private void setMultipleExpanding(boolean multipleExpanding) { mListView.setNestType(multipleExpanding ? NestType.MULTIPLE : NestType.SINGLE); } + private void setInitiallyExpanded(boolean expanded) { + DataProvider.setGroup2InitiallyExpanded(expanded); + mListAdapter.reloadData(); + } + + private CompoundButton.OnCheckedChangeListener mOnCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() { @Override @@ -95,6 +105,9 @@ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { case R.id.alwaysExpanded: setAlwaysExpanded(isChecked); break; + case R.id.initiallyExpanded: + setInitiallyExpanded(isChecked); + break; } } }; @@ -140,6 +153,11 @@ public boolean isExpandable(Object object) { return DataProvider.isExpandable((BaseItem) object); } + @Override + protected boolean isInitiallyExpanded(Object object) { + return DataProvider.isInitiallyExpanded((BaseItem) object); + } + @Override public View getViewForObject(Object object, View convertView, ItemInfo itemInfo) { ViewHolder viewHolder; diff --git a/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/data/DataProvider.java b/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/data/DataProvider.java index e843c52..fead098 100644 --- a/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/data/DataProvider.java +++ b/sample-app/src/main/java/pl/openrnd/multilevellistview/sample/data/DataProvider.java @@ -28,24 +28,25 @@ public class DataProvider { * Following variables refer only to data generation process. * For instance, if ITEMS_PER_LEVEL = 2 and MAX_LEVELS = 3, * list should look like this: - * + 1 - * | + 1.1 - * | - - 1.1.1 - * | - - 1.1.2 - * | + 1.2 - * | - - 1.2.1 - * | - - 1.2.2 - * | - - 1.2.3 - * + 2 - * | + 2.1 - * | - - 2.1.1 - * | - - 2.1.2 - * | + 2.2 - * | - - 2.2.1 - * | - - 2.2.2 + * + 1 + * | + 1.1 + * | - - 1.1.1 + * | - - 1.1.2 + * | + 1.2 + * | - - 1.2.1 + * | - - 1.2.2 + * | - - 1.2.3 + * + 2 + * | + 2.1 + * | - - 2.1.1 + * | - - 2.1.2 + * | + 2.2 + * | - - 2.2.1 + * | - - 2.2.2 */ private static final int ITEMS_PER_LEVEL = 4; private static final int MAX_LEVELS = 6; + private static boolean isGroup2InitiallyExpanded = false; public static List getInitialItems() { return getSubItems(new GroupItem("root")); @@ -56,8 +57,8 @@ public static List getSubItems(BaseItem baseItem) { throw new IllegalArgumentException("GroupItem required"); } - GroupItem groupItem = (GroupItem)baseItem; - if(groupItem.getLevel() >= MAX_LEVELS){ + GroupItem groupItem = (GroupItem) baseItem; + if (groupItem.getLevel() >= MAX_LEVELS) { return null; } @@ -70,7 +71,7 @@ public static List getSubItems(BaseItem baseItem) { BaseItem item; if (i % 2 == 0 && nextLevel != MAX_LEVELS) { item = new GroupItem("Group " + Integer.toString(++groupNr)); - ((GroupItem)item).setLevel(nextLevel); + ((GroupItem) item).setLevel(nextLevel); } else { item = new Item("Item " + Integer.toString(++itemNr)); } @@ -82,4 +83,12 @@ public static List getSubItems(BaseItem baseItem) { public static boolean isExpandable(BaseItem baseItem) { return baseItem instanceof GroupItem; } + + public static boolean isInitiallyExpanded(BaseItem baseItem) { + return isGroup2InitiallyExpanded && baseItem.getName().startsWith("Group 2"); + } + + public static void setGroup2InitiallyExpanded(boolean expanded) { + isGroup2InitiallyExpanded = expanded; + } } diff --git a/sample-app/src/main/res/layout/data_activity.xml b/sample-app/src/main/res/layout/data_activity.xml index b008ac4..90a6e3f 100644 --- a/sample-app/src/main/res/layout/data_activity.xml +++ b/sample-app/src/main/res/layout/data_activity.xml @@ -27,6 +27,17 @@ android:textSize="@dimen/font_default" android:layout_marginBottom="@dimen/offset_default"/> + + MultiLevelListView Sample Multiplied expanding Always expanded + Group 2 initially expanded