TreeView like Functionality Android

前端 未结 3 1099
南旧
南旧 2021-01-01 05:42

I\'m implementing TreeView for my app. I\'ve searched the web, found one ListView implementation TreeView which is too messy. Is it p

3条回答
  •  孤独总比滥情好
    2021-01-01 06:27

    I solved my problem long time ago with ListView. There were people who had the same problem and asked me to share my solution, so here I am.

    TreeElementI.java :

    public interface TreeElementI extends Serializable{
      public void addChild(TreeElementI 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 getChildList();
      public TreeElementI getParent();
      public void setParent(TreeElementI parent);
    }
    

    TreeElement.java :

    public class TreeElement implements TreeElementI{
    private String id;
    private String outlineTitle;
    private boolean hasParent;
    private boolean hasChild;
    private TreeElementI parent;
    private int level;
    private ArrayList childList;
    private boolean expanded;
    
    public TreeElement(String id, String outlineTitle) {
        super();
        this.childList = new ArrayList();
        this.id = id;
        this.outlineTitle = outlineTitle;
        this.level = 0;
        this.hasParent = true;
        this.hasChild = false;
        this.parent = null;
    }
    
    public TreeElement(String id, String outlineTitle, boolean hasParent, boolean hasChild, TreeElement parent, int level, boolean expanded) {
        super();
        this.childList = new ArrayList();
        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(TreeElementI 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(String id) {
        this.id = id;
    }
    
    @Override
    public String getOutlineTitle() {
        return this.outlineTitle;
    }
    
    @Override
    public void setOutlineTitle(String outlineTitle) {
        this.outlineTitle = outlineTitle;
    }
    
    @Override
    public boolean isHasParent() {
        return this.hasParent;
    }
    
    @Override
    public void setHasParent(boolean hasParent) {
        this.hasParent = hasParent;
    }
    
    @Override
    public boolean isHasChild() {
        return this.hasChild;
    }
    
    @Override
    public void setHasChild(boolean hasChild) {
        this.hasChild = hasChild;
    }
    
    @Override
    public int getLevel() {
        return this.level;
    }
    
    @Override
    public void setLevel(int level) {
        this.level = level;
    }
    
    @Override
    public boolean isExpanded() {
        return this.expanded;
    }
    
    @Override
    public void setExpanded(boolean expanded) {
        this.expanded = expanded;
    }
    
    @Override
    public ArrayList getChildList() {
        return this.childList;
    }
    
    @Override
    public TreeElementI getParent() {
        return this.parent;
    }
    
    @Override
    public void setParent(TreeElementI parent) {
        this.parent = parent;
    }
    }
    

    TreeViewClassifAdapter.java :

    public class TreeViewClassifAdapter extends BaseAdapter {
    private static final int TREE_ELEMENT_PADDING_VAL = 25;
    private List fileList;
    private Context context;
    private Bitmap iconCollapse;
    private Bitmap iconExpand;
    private Dialog dialog;
    private EditText textLabel;
    private XTreeViewClassif treeView;
    
    public TreeViewClassifAdapter(Context context, List fileList, Dialog dialog, EditText textLabel, XTreeViewClassif 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 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 TreeElementI elem = (TreeElementI) 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) 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 list;
        private int position;
    
        public TextClickListener(ArrayList 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 list;
        private TreeViewClassifAdapter adapter;
        private int position;
    
        public IconClickListener(TreeViewClassifAdapter adapter, int position) {
            this.list = (ArrayList) 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);
                TreeElementI element = list.get(position);
                ArrayList temp = new ArrayList();
    
                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 {
                TreeElementI obj = list.get(position);
                obj.setExpanded(true);
                int level = obj.getLevel();
                int nextLevel = level + 1;
    
                for (TreeElementI element : obj.getChildList()) {
                    element.setLevel(nextLevel);
                    element.setExpanded(false);
                    list.add(position + 1, element);
                }
                adapter.notifyDataSetChanged();
            }
        }
    }
    }
    

提交回复
热议问题