X Tutup
Skip to content

Commit 081d455

Browse files
Bogdan MelnychukBogdan Melnychuk
authored andcommitted
Selection for nodes added
1 parent 02a162a commit 081d455

File tree

11 files changed

+510
-7
lines changed

11 files changed

+510
-7
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ android {
55
buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION
66

77
defaultConfig {
8-
applicationId "com.unnamed.b.atv.sample"
8+
applicationId "com.unnamed.b.atv.demo"
99
minSdkVersion Integer.parseInt(project.ANDROID_BUILD_MIN_SDK_VERSION)
1010
targetSdkVersion Integer.parseInt(project.ANDROID_BUILD_TARGET_SDK_VERSION)
1111
versionName project.VERSION_NAME

app/src/main/java/com/unnamed/b/atv/sample/activity/MainActivity.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.unnamed.b.atv.sample.R;
1313
import com.unnamed.b.atv.sample.fragment.CustomViewHolderFragment;
1414
import com.unnamed.b.atv.sample.fragment.FolderStructureFragment;
15+
import com.unnamed.b.atv.sample.fragment.SelectableTreeFragment;
1516

1617
import java.util.ArrayList;
1718
import java.util.LinkedHashMap;
@@ -30,6 +31,7 @@ protected void onCreate(Bundle savedInstanceState) {
3031
final LinkedHashMap<String, Class<?>> listItems = new LinkedHashMap<>();
3132
listItems.put("Folder Structure Example", FolderStructureFragment.class);
3233
listItems.put("Custom Holder Example", CustomViewHolderFragment.class);
34+
listItems.put("Selectable Nodes", SelectableTreeFragment.class);
3335

3436

3537
final List<String> list = new ArrayList(listItems.keySet());
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package com.unnamed.b.atv.sample.fragment;
2+
3+
import android.app.Fragment;
4+
import android.os.Bundle;
5+
import android.text.TextUtils;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.Toast;
10+
11+
import com.unnamed.b.atv.model.TreeNode;
12+
import com.unnamed.b.atv.sample.R;
13+
import com.unnamed.b.atv.sample.holder.IconTreeItemHolder;
14+
import com.unnamed.b.atv.sample.holder.SelectableHeaderHolder;
15+
import com.unnamed.b.atv.sample.holder.SelectableItemHolder;
16+
import com.unnamed.b.atv.view.AndroidTreeView;
17+
18+
/**
19+
* Created by Bogdan Melnychuk on 2/12/15.
20+
*/
21+
public class SelectableTreeFragment extends Fragment {
22+
private AndroidTreeView tView;
23+
private boolean selectionModeEnabled = false;
24+
25+
@Override
26+
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
27+
28+
View rootView = inflater.inflate(R.layout.fragment_selectable_nodes, null, false);
29+
ViewGroup containerView = (ViewGroup) rootView.findViewById(R.id.container);
30+
31+
View selectionModeButton = rootView.findViewById(R.id.btn_toggleSelection);
32+
selectionModeButton.setOnClickListener(new View.OnClickListener() {
33+
@Override
34+
public void onClick(View v) {
35+
selectionModeEnabled = !selectionModeEnabled;
36+
tView.setSelectionModeEnabled(selectionModeEnabled);
37+
}
38+
});
39+
40+
View selectAllBtn = rootView.findViewById(R.id.btn_selectAll);
41+
selectAllBtn.setOnClickListener(new View.OnClickListener() {
42+
@Override
43+
public void onClick(View v) {
44+
if (!selectionModeEnabled) {
45+
Toast.makeText(getActivity(), "Enable selection mode first", Toast.LENGTH_SHORT).show();
46+
}
47+
tView.selectAll(true);
48+
}
49+
});
50+
51+
View deselectAll = rootView.findViewById(R.id.btn_deselectAll);
52+
deselectAll.setOnClickListener(new View.OnClickListener() {
53+
@Override
54+
public void onClick(View v) {
55+
if (!selectionModeEnabled) {
56+
Toast.makeText(getActivity(), "Enable selection mode first", Toast.LENGTH_SHORT).show();
57+
}
58+
tView.deselectAll();
59+
}
60+
});
61+
62+
View check = rootView.findViewById(R.id.btn_checkSelection);
63+
check.setOnClickListener(new View.OnClickListener() {
64+
@Override
65+
public void onClick(View v) {
66+
if (!selectionModeEnabled) {
67+
Toast.makeText(getActivity(), "Enable selection mode first", Toast.LENGTH_SHORT).show();
68+
} else {
69+
Toast.makeText(getActivity(), tView.getSelected().size() + " selected", Toast.LENGTH_SHORT).show();
70+
}
71+
}
72+
});
73+
74+
TreeNode root = TreeNode.root();
75+
76+
TreeNode folder1 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Folder 1")).setViewHolder(new SelectableHeaderHolder(getActivity()));
77+
TreeNode folder2 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Folder 2")).setViewHolder(new SelectableHeaderHolder(getActivity()));
78+
TreeNode folder3 = new TreeNode(new IconTreeItemHolder.IconTreeItem(R.string.ic_folder, "Folder 3")).setViewHolder(new SelectableHeaderHolder(getActivity()));
79+
80+
fillFolder(folder1);
81+
fillFolder(folder2);
82+
fillFolder(folder3);
83+
84+
85+
root.addChildren(folder1, folder2, folder3);
86+
87+
tView = new AndroidTreeView(getActivity(), root);
88+
containerView.addView(tView.getView());
89+
90+
if (savedInstanceState != null) {
91+
String state = savedInstanceState.getString("tState");
92+
if (!TextUtils.isEmpty(state)) {
93+
tView.restoreState(state);
94+
}
95+
}
96+
return rootView;
97+
}
98+
99+
private void fillFolder(TreeNode folder) {
100+
TreeNode file1 = new TreeNode("File1").setViewHolder(new SelectableItemHolder(getActivity()));
101+
TreeNode file2 = new TreeNode("File2").setViewHolder(new SelectableItemHolder(getActivity()));
102+
TreeNode file3 = new TreeNode("File3").setViewHolder(new SelectableItemHolder(getActivity()));
103+
folder.addChildren(file1, file2, file3);
104+
}
105+
106+
@Override
107+
public void onSaveInstanceState(Bundle outState) {
108+
super.onSaveInstanceState(outState);
109+
outState.putString("tState", tView.getSaveState());
110+
}
111+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.unnamed.b.atv.sample.holder;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.widget.CheckBox;
7+
import android.widget.CompoundButton;
8+
import android.widget.TextView;
9+
10+
import com.github.johnkil.print.PrintView;
11+
import com.unnamed.b.atv.model.TreeNode;
12+
import com.unnamed.b.atv.sample.R;
13+
14+
/**
15+
* Created by Bogdan Melnychuk on 2/15/15.
16+
*/
17+
public class SelectableHeaderHolder extends TreeNode.BaseNodeViewHolder<IconTreeItemHolder.IconTreeItem> {
18+
private TextView tvValue;
19+
private PrintView arrowView;
20+
private CheckBox nodeSelector;
21+
22+
public SelectableHeaderHolder(Context context) {
23+
super(context);
24+
}
25+
26+
@Override
27+
public View createNodeView(final TreeNode node, IconTreeItemHolder.IconTreeItem value) {
28+
final LayoutInflater inflater = LayoutInflater.from(context);
29+
final View view = inflater.inflate(R.layout.layout_selectable_header, null, false);
30+
31+
tvValue = (TextView) view.findViewById(R.id.node_value);
32+
tvValue.setText(value.text);
33+
34+
final PrintView iconView = (PrintView) view.findViewById(R.id.icon);
35+
iconView.setIconText(context.getResources().getString(value.icon));
36+
37+
arrowView = (PrintView) view.findViewById(R.id.arrow_icon);
38+
if (node.isLeaf()) {
39+
arrowView.setVisibility(View.GONE);
40+
}
41+
42+
nodeSelector = (CheckBox) view.findViewById(R.id.node_selector);
43+
nodeSelector.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
44+
@Override
45+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
46+
node.setSelected(isChecked);
47+
}
48+
});
49+
nodeSelector.setChecked(node.isSelected());
50+
51+
return view;
52+
}
53+
54+
@Override
55+
public void toggle(boolean active) {
56+
arrowView.setIconText(context.getResources().getString(active ? R.string.ic_keyboard_arrow_down : R.string.ic_keyboard_arrow_right));
57+
}
58+
59+
@Override
60+
public void toggleSelectionMode(boolean editModeEnabled) {
61+
nodeSelector.setVisibility(editModeEnabled ? View.VISIBLE : View.GONE);
62+
nodeSelector.setChecked(mNode.isSelected());
63+
}
64+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.unnamed.b.atv.sample.holder;
2+
3+
import android.content.Context;
4+
import android.view.LayoutInflater;
5+
import android.view.View;
6+
import android.widget.CheckBox;
7+
import android.widget.CompoundButton;
8+
import android.widget.TextView;
9+
10+
import com.unnamed.b.atv.model.TreeNode;
11+
import com.unnamed.b.atv.sample.R;
12+
13+
/**
14+
* Created by Bogdan Melnychuk on 2/15/15.
15+
*/
16+
public class SelectableItemHolder extends TreeNode.BaseNodeViewHolder<String> {
17+
private TextView tvValue;
18+
private CheckBox nodeSelector;
19+
20+
public SelectableItemHolder(Context context) {
21+
super(context);
22+
}
23+
24+
@Override
25+
public View createNodeView(final TreeNode node, String value) {
26+
final LayoutInflater inflater = LayoutInflater.from(context);
27+
final View view = inflater.inflate(R.layout.layout_selectable_item, null, false);
28+
29+
tvValue = (TextView) view.findViewById(R.id.node_value);
30+
tvValue.setText(value);
31+
32+
33+
nodeSelector = (CheckBox) view.findViewById(R.id.node_selector);
34+
nodeSelector.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
35+
@Override
36+
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
37+
node.setSelected(isChecked);
38+
}
39+
});
40+
nodeSelector.setChecked(node.isSelected());
41+
42+
if (node.isLastChild()) {
43+
view.findViewById(R.id.bot_line).setVisibility(View.INVISIBLE);
44+
}
45+
46+
return view;
47+
}
48+
49+
50+
@Override
51+
public void toggleSelectionMode(boolean editModeEnabled) {
52+
nodeSelector.setVisibility(editModeEnabled ? View.VISIBLE : View.GONE);
53+
nodeSelector.setChecked(mNode.isSelected());
54+
}
55+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="match_parent"
5+
android:layout_height="match_parent">
6+
7+
<LinearLayout
8+
android:id="@+id/status"
9+
android:background="#ff0099cc"
10+
android:layout_width="match_parent"
11+
android:layout_height="wrap_content">
12+
13+
14+
<com.github.johnkil.print.PrintButton
15+
android:id="@+id/btn_toggleSelection"
16+
android:layout_width="wrap_content"
17+
android:layout_height="wrap_content"
18+
app:iconSize="28dp"
19+
app:iconColor="#12558C"
20+
app:iconFont="fonts/material-icon-font.ttf"
21+
app:iconText="@string/ic_check_box_outline" />
22+
23+
24+
<Button
25+
android:id="@+id/btn_selectAll"
26+
android:text="+ All"
27+
android:layout_width="wrap_content"
28+
android:layout_height="wrap_content" />
29+
30+
<Button
31+
android:id="@+id/btn_deselectAll"
32+
android:text="- All"
33+
android:layout_width="wrap_content"
34+
android:layout_height="wrap_content" />
35+
36+
<Button
37+
android:id="@+id/btn_checkSelection"
38+
android:text="Get Selection"
39+
android:layout_width="wrap_content"
40+
android:layout_height="wrap_content" />
41+
42+
</LinearLayout>
43+
44+
45+
<RelativeLayout
46+
android:layout_below="@id/status"
47+
android:layout_width="match_parent"
48+
android:layout_height="match_parent"
49+
android:id="@+id/container"></RelativeLayout>
50+
51+
52+
</RelativeLayout>
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:app="http://schemas.android.com/apk/res-auto"
4+
android:layout_width="match_parent"
5+
android:minHeight="48dp"
6+
android:paddingLeft="10dp"
7+
android:layout_height="match_parent">
8+
9+
<CheckBox
10+
android:visibility="gone"
11+
android:layout_centerVertical="true"
12+
android:layout_centerHorizontal="true"
13+
android:layout_alignParentLeft="true"
14+
android:id="@+id/node_selector"
15+
android:layout_width="wrap_content"
16+
android:layout_height="wrap_content" />
17+
18+
<com.github.johnkil.print.PrintView
19+
android:layout_alignWithParentIfMissing="true"
20+
android:layout_toRightOf="@+id/node_selector"
21+
android:id="@+id/arrow_icon"
22+
android:layout_centerVertical="true"
23+
android:layout_centerHorizontal="true"
24+
android:layout_width="wrap_content"
25+
android:layout_height="wrap_content"
26+
app:iconText="@string/ic_keyboard_arrow_right"
27+
app:iconColor="#12558C"
28+
app:iconFont="fonts/material-icon-font.ttf"
29+
app:iconSize="20dp" />
30+
31+
<com.github.johnkil.print.PrintView
32+
android:layout_marginLeft="5dp"
33+
android:layout_alignWithParentIfMissing="true"
34+
android:id="@+id/icon"
35+
android:layout_toRightOf="@id/arrow_icon"
36+
android:layout_centerVertical="true"
37+
android:layout_centerHorizontal="true"
38+
android:layout_width="wrap_content"
39+
android:layout_height="wrap_content"
40+
app:iconText="@string/ic_email"
41+
app:iconColor="#12558C"
42+
app:iconFont="fonts/material-icon-font.ttf"
43+
app:iconSize="24dp" />
44+
45+
<TextView
46+
android:layout_centerVertical="true"
47+
android:textSize="16sp"
48+
android:layout_marginLeft="10dp"
49+
android:layout_toRightOf="@+id/icon"
50+
android:id="@+id/node_value"
51+
android:layout_width="match_parent"
52+
android:layout_height="wrap_content" />
53+
</RelativeLayout>

0 commit comments

Comments
 (0)
X Tutup