TreeView 类似功能 Android [英] TreeView like Functionality Android

查看:13
本文介绍了TreeView 类似功能 Android的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的应用实现 TreeView.我在网上搜索了一下,发现一个 ListView 实现 TreeView 太乱了.是否可以使用 ExpandableListView 实现 n 级 TreeView?

I'm implementing TreeView for my app. I've searched the web, found one ListView implementation TreeView which is too messy. Is it possible to implement n level TreeView using ExpandableListView?

请分享您的想法或参考一些示例.

Please Share your Ideas or reference me to some examples.

提前致谢.

推荐答案

我很久以前用 ListView 解决了我的问题.有人遇到了同样的问题,并要求我分享我的解决方案,所以我来了.

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<TreeElementI> 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<TreeElementI> childList;
private boolean expanded;

public TreeElement(String id, String outlineTitle) {
    super();
    this.childList = new ArrayList<TreeElementI>();
    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<TreeElementI>();
    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<TreeElementI> 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<TreeElementI> fileList;
private Context context;
private Bitmap iconCollapse;
private Bitmap iconExpand;
private Dialog dialog;
private EditText textLabel;
private XTreeViewClassif treeView;

public TreeViewClassifAdapter(Context context, List<TreeElementI> 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<TreeElementI> 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<TreeElementI>) 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<TreeElementI> list;
    private int position;

    public TextClickListener(ArrayList<TreeElementI> 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<TreeElementI> list;
    private TreeViewClassifAdapter adapter;
    private int position;

    public IconClickListener(TreeViewClassifAdapter adapter, int position) {
        this.list = (ArrayList<TreeElementI>) 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<TreeElementI> temp = new ArrayList<TreeElementI>();

            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();
        }
    }
}
}

这篇关于TreeView 类似功能 Android的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆