Skip to content

Instantly share code, notes, and snippets.

@HKhademian
Last active February 10, 2016 10:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HKhademian/79139337c390b333fac8 to your computer and use it in GitHub Desktop.
Save HKhademian/79139337c390b333fac8 to your computer and use it in GitHub Desktop.
Android TreeView using ListViews
public interface TreeElement extends Serializable {
public void addChild(TreeElement child);
public String getId();
public void setId(String id);
public String getOutlineTitle();
public void setOutlineTitle(String outlineTitle);
public boolean isHasParent();
public void setHasParent(boolean hasParent);
public boolean isHasChild();
public void setHasChild(boolean hasChild);
public int getLevel();
public void setLevel(int level);
public boolean isExpanded();
public void setExpanded(boolean expanded);
public ArrayList<TreeElement> getChildList();
public TreeElement getParent();
public void setParent(TreeElement parent);
}
import java.util.ArrayList;
public class TreeElementImpl implements TreeElement {
private String id;
private String outlineTitle;
private boolean hasParent;
private boolean hasChild;
private TreeElement parent;
private int level;
private final List<TreeElement> childList = new ArrayList<>();
private boolean expanded;
public TreeElementImpl(final String id, final String outlineTitle) {
super();
this.id = id;
this.outlineTitle = outlineTitle;
this.level = 0;
this.hasParent = true;
this.hasChild = false;
this.parent = null;
}
public TreeElementImpl(final String id, final String outlineTitle, final boolean hasParent, final boolean hasChild, final TreeElement parent, final int level, final boolean expanded) {
super();
this.id = id;
this.outlineTitle = outlineTitle;
this.hasParent = hasParent;
this.hasChild = hasChild;
this.parent = parent;
if (parent != null)
this.parent.getChildList().add(this);
this.level = level;
this.expanded = expanded;
}
@Override
public void addChild(final TreeElement child) {
this.getChildList().add(child);
this.setHasParent(false);
this.setHasChild(true);
child.setParent(this);
child.setLevel(this.getLevel() + 1);
}
@Override
public String getId() {
return this.id;
}
@Override
public void setId(final String id) {
this.id = id;
}
@Override
public String getOutlineTitle() {
return this.outlineTitle;
}
@Override
public void setOutlineTitle(final String outlineTitle) {
this.outlineTitle = outlineTitle;
}
@Override
public boolean isHasParent() {
return this.hasParent;
}
@Override
public void setHasParent(final boolean hasParent) {
this.hasParent = hasParent;
}
@Override
public boolean isHasChild() {
return this.hasChild;
}
@Override
public void setHasChild(final boolean hasChild) {
this.hasChild = hasChild;
}
@Override
public int getLevel() {
return this.level;
}
@Override
public void setLevel(final int level) {
this.level = level;
}
@Override
public boolean isExpanded() {
return this.expanded;
}
@Override
public void setExpanded(final boolean expanded) {
this.expanded = expanded;
}
@Override
public ArrayList<TreeElement> getChildList() {
return this.childList;
}
@Override
public TreeElement getParent() {
return this.parent;
}
@Override
public void setParent(final TreeElement parent) {
this.parent = parent;
}
}
import android.widget.ListView;
public class TreeViewClassifAdapter extends BaseAdapter {
private static final int TREE_ELEMENT_PADDING_VAL = 25;
private List<TreeElement> fileList;
private Context context;
private Bitmap iconCollapse;
private Bitmap iconExpand;
private Dialog dialog;
private EditText textLabel;
private ListView treeView;
public TreeViewClassifAdapter(final Context context, final List<TreeElement> fileList, final Dialog dialog, final EditText textLabel, final ListView treeView) {
this.context = context;
this.fileList = fileList;
this.dialog = dialog;
this.textLabel = textLabel;
this.treeView = treeView;
iconCollapse = BitmapFactory.decodeResource(context.getResources(), R.drawable.x_treeview_outline_list_collapse);
iconExpand = BitmapFactory.decodeResource(context.getResources(), R.drawable.x_treeview_outline_list_expand);
}
public List<TreeElement> getListData() {
return this.fileList;
}
@Override
public int getCount() {
return this.fileList.size();
}
@Override
public Object getItem(int position) {
return this.fileList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
convertView = View.inflate(context, R.layout.x_treeview_classif_list_item, null);
holder = new ViewHolder();
holder.setTextView((TextView) convertView.findViewById(R.id.text));
holder.setImageView((ImageView) convertView.findViewById(R.id.icon));
convertView.setTag(holder);
final TreeElement elem = (TreeElement) getItem(position);
int level = elem.getLevel();
holder.getIcon().setPadding(TREE_ELEMENT_PADDING_VAL * (level + 1), holder.icon.getPaddingTop(), 0, holder.icon.getPaddingBottom());
holder.getText().setText(elem.getOutlineTitle());
if (elem.isHasChild() && (elem.isExpanded() == false))
holder.getIcon().setImageBitmap(iconCollapse);
else if (elem.isHasChild() && (elem.isExpanded() == true))
holder.getIcon().setImageBitmap(iconExpand);
else if (!elem.isHasChild()) {
holder.getIcon().setImageBitmap(iconCollapse);
holder.getIcon().setVisibility(View.INVISIBLE);
}
IconClickListener iconListener = new IconClickListener(this, position);
TextClickListener txtListener = new TextClickListener((ArrayList<TreeElement>) this.getListData(), position);
holder.getIcon().setOnClickListener(iconListener);
holder.getText().setOnClickListener(txtListener);
return convertView;
}
private class ViewHolder {
ImageView icon;
TextView text;
public TextView getText() {
return this.text;
}
public void setTextView(TextView text) {
this.text = text;
}
public ImageView getIcon() {
return this.icon;
}
public void setImageView(ImageView icon) {
this.icon = icon;
}
}
/**
* Listener For TreeElement Text Click
*/
private class TextClickListener implements View.OnClickListener {
private ArrayList<TreeElement> list;
private int position;
public TextClickListener(ArrayList<TreeElement> list, int position) {
this.list = list;
this.position = position;
}
@Override
public void onClick(View v) {
treeView.setXValue(String.valueOf(list.get(position).getId()));
dialog.dismiss();
}
}
/**
* Listener for TreeElement "Expand" button Click
*/
private class IconClickListener implements View.OnClickListener {
private ArrayList<TreeElement> list;
private TreeViewClassifAdapter adapter;
private int position;
public IconClickListener(TreeViewClassifAdapter adapter, int position) {
this.list = (ArrayList<TreeElement>) adapter.getListData();
this.adapter = adapter;
this.position = position;
}
@Override
public void onClick(View v) {
if (!list.get(position).isHasChild())
return;
if (list.get(position).isExpanded()) {
list.get(position).setExpanded(false);
TreeElement element = list.get(position);
ArrayList<TreeElement> temp = new ArrayList<TreeElement>();
for (int i = position + 1; i < list.size(); i++) {
if (element.getLevel() >= list.get(i).getLevel())
break;
temp.add(list.get(i));
}
list.removeAll(temp);
adapter.notifyDataSetChanged();
} else {
TreeElement obj = list.get(position);
obj.setExpanded(true);
int level = obj.getLevel();
int nextLevel = level + 1;
for (TreeElement element : obj.getChildList()) {
element.setLevel(nextLevel);
element.setExpanded(false);
list.add(position + 1, element);
}
adapter.notifyDataSetChanged();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment