Last active
February 10, 2016 10:12
-
-
Save HKhademian/79139337c390b333fac8 to your computer and use it in GitHub Desktop.
Android TreeView using ListViews
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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