Android 类似 TreeView 的功能

2023-12-05

我正在实施TreeView对于我的应用程序。 我在网上搜索了一下,找到了一个ListView执行TreeView这太乱了。是否可以实现n级TreeView using ExpandableListView?

请分享您的想法或给我参考一些例子。

提前致谢。


我很久以前就解决了我的问题ListView。有人遇到同样的问题并要求我分享我的solution,所以我在这里。

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

树元素.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();
        }
    }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 类似 TreeView 的功能 的相关文章

随机推荐

  • Mac 上未设置 TERM 环境变量

    我不断收到 TERM 环境变量未设置 的消息 当我在 Mac 终端上使用 svn 命令时出现错误 我以为我已经通过以下操作设置了我的个人资料 export SVN EDITOR usr bin nano export EDITOR usr
  • Laravel Carbon 日期 diffInDays() 出现字符串错误

    我需要找出两个日期之间的差异 假设我有 2017 02 01 2017 01 01 输出的就是两天之间的天数 formatted dt1 Carbon parse a gt date gt format Y m d formatted dt
  • PDOStatement::execute(): SQLSTATE[HY093]: 参数数量无效:绑定变量的数量与标记数量不匹配

    sql INSERT INTO table name day campaign name campaign id views CPM cost currency cost EUR VALUES day campaign name campa
  • CMake - 始终构建特定文件

    我有一个特定的文件 无论它是否被修改 都应该在每次编译时重建 原因是它取决于值变化的系统宏 我如何使用 CMake 强制重建 我不想将其绑定到特定目标 在 CMakeLists txt 中指定的任何目标开始实际构建过程之前 应该 触及 该文
  • EclipseLink 自定义表和列命名策略

    有没有办法让 EclipseLink 将驼峰式大小写转换为下划线 例如 class MyEntity gt select from MY ENTITY 理想情况下 我可以将预先打包的东西作为属性放入 persistence xml 中 您可
  • 将 pandas 系列和 dataframe 对象转换为 numpy 数组

    系列到 Numpy 数组 我有一个pandas系列对象如下所示 s1 pd Series 0 1 2 3 4 5 6 7 8 index AB AC AD BA BB BC CA CB CC 我想把这个系列转换成numpy数组如下 seri
  • 如何以编程方式启动特定应用程序?

    我想启动一个特定的应用程序 我知道如何执行意图 但如果有多个应用程序可以处理意图 我想避免选择菜单 我想直接进入特定的应用程序 希望这是有道理的 您应该使用包管理器的功能 Context ctx this or you can replac
  • 在 Flask 应用程序中返回 Excel 文件

    我正在创建一个 Flask 应用程序 提示用户输入 Excel 文件 对其进行一些处理 然后将文件返回给用户以便他们可以下载它 请忽略任何未使用的导入 我计划稍后使用它们 我的功能已关闭 我只是不确定如何将文件发送回用户以便他们可以下载它
  • JSP 表达式适用于 JSTL 标记,但不适用于 Struts 2 标记

    我在我的项目中使用 JSTL 和 Struts 2 我正在尝试使用 JSTL 和 Struts 2 标记在范围内设置一个值 如下所示 div div div div
  • 警告:mysql_fetch_object():提供的参数不是有效的 MySQL 结果资源

    地狱在那里 当我尝试连接以从数据库中提取内容时 出现以下错误 Warning mysql fetch object supplied argument is not a valid MySQL result resource in home
  • String 与 Stringbuffer 作为 HashMap 键

    我试图理解为什么 String 和 Stringbuilder StringBuffer 在用作 Hashmap 键时会受到不同的对待 让我用下面的插图来澄清我的困惑 示例 1 使用字符串 String s1 new String abc
  • 图库内的图像缩放/平移

    我正在尝试在 Android 图库小部件中缩放 平移图像 图像覆盖整个屏幕 虽然我可以缩放 平移图库中的图像 但我无法滑动到下一个 上一个图像 单个图像的缩放和平移效果很好 我创建了一个 TouchImageView 它扩展了 ImageV
  • 为什么 GWT 不允许我们在文档元素上添加关键事件处理程序?

    我知道有FocusPanel我可以在其上附加此类处理程序 但根据我的经验 该组件的行为不太好 所以我想尽可能避免它 所以我想知道为什么没有办法在文档上附加密钥处理程序 根据怪异模式它可以跨浏览器工作 所以这不应该是一个问题 我也尝试自己编写
  • 用于多对象分类的支持向量机

    我正在尝试使用线性支持向量机进行多类对象类别识别 到目前为止 我了解到主要使用两种方法 一对一 OVA 和一对一 OVO 但我很难理解它的实现 我的意思是我认为使用的步骤是 首先 特征描述符是通过 SIFT 准备的 所以我有一个 128XN
  • 子文档中的 SD MongoDB 多态性

    我刚刚开始使用 spring data mongodb 用 Ja va 开发一些应用程序 并遇到了一些我无法解决的问题 有几个像这样的文档 bean Document collection myBeanBar public class Ba
  • 显示站点根目录外部的图像

    类似的问题在这里被问到 从文档根目录外部提供图像 给出并接受的解决方案是使用 Apache Aliases 但是 文件夹的 Apache 别名是否也会将其公开 我想服务于一个形象并保持它在公众视野中的隐形性 除了别名之外 有谁知道在文档根目
  • Git 从浅克隆中查找自 以来修改的文件

    我在 CI 盒子上运行测试 为了加快速度 我只是做了一个浅克隆 git clone depth 1 email protected JoshCheek some repo git 假设所有测试都通过 我想触发管道中的下一步 触发的内容取决于
  • bigquery 流缓冲区会持续多长时间

    我目前正在将数据从sql server数据库系统迁移到bigquery 并且在尝试从具有活动流缓冲区的bigquery表中删除记录时遇到了问题 您能否确认流缓冲区在被删除之前会持续多长时间那么删除操作可以运行吗 我发现这给开发过程带来了不必
  • 在 C# 中解析阿拉伯日期?

    我在解析日期时遇到了问题 该程序被阿拉伯日期绊倒了 因为某些原因DateTime TryParse 为这种文化输出垃圾 这是说明我的问题的示例代码 var culture CultureInfo CreateSpecificCulture
  • Android 类似 TreeView 的功能

    我正在实施TreeView对于我的应用程序 我在网上搜索了一下 找到了一个ListView执行TreeView这太乱了 是否可以实现n级TreeView using ExpandableListView 请分享您的想法或给我参考一些例子 提