Android中自定义TreeView树型列表(记录)

效果图如下:

一、节点信息类

/**
 * Tree节点信息类
 */
public class TreePoint {
    private String ID; //账号id
    private String NNAME; //原因名称
    private String PARENTID; //父id     0表示父节点
    private String ISLEAF; //是否是叶子节点   1为叶子节点
    private int DISPLAY_ORDER; //同一个级别的显示顺序
    private boolean isExpand = false;  //是否展开了
    private boolean isSelected = false; //是否选中了


    public TreePoint(String ID, String NNAME, String PARENTID, String ISLEAF, int DISPLAY_ORDER) {
        this.ID = ID;
        this.NNAME = NNAME;
        this.PARENTID = PARENTID;
        this.ISLEAF = ISLEAF;
        this.DISPLAY_ORDER = DISPLAY_ORDER;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getNNAME() {
        return NNAME;
    }

    public void setNAME(String NAME) {
        this.NNAME = NNAME;
    }

    public String getPARENTID() {
        return PARENTID;
    }

    public void setPARENTID(String PARENTID) {
        this.PARENTID = PARENTID;
    }

    public String getISLEAF() {
        return ISLEAF;
    }

    public void setISLEAF(String ISLEAF) {
        this.ISLEAF = ISLEAF;
    }

    public int getDISPLAY_ORDER() {
        return DISPLAY_ORDER;
    }

    public void setDISPLAY_ORDER(int DISPLAY_ORDER) {
        this.DISPLAY_ORDER = DISPLAY_ORDER;
    }

    public boolean isExpand() {
        return isExpand;
    }

    public void setExpand(boolean expand) {
        isExpand = expand;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}

二、数据适配器TreeAdapter

/**
 * Tree数据适配器
 */
public class TreeAdapter extends BaseAdapter {

    private Context mContext;
    private List<TreePoint> pointList;
    private HashMap<String, TreePoint> pointMap = new HashMap<>();
    private HashMap<String, String> isHaveChildrenMap = new HashMap<>();
    private ViewHolder viewHolder;

    public TreeAdapter(Context mContext, List<TreePoint> pointList, HashMap<String
            , TreePoint> pointMap, HashMap<String, String> isHaveChildrenMap) {
        this.mContext = mContext;
        this.pointList = pointList;
        this.pointMap = pointMap;
        this.isHaveChildrenMap = isHaveChildrenMap;
    }

    @Override
    public int getCount() {
        int count = 0;
        for (TreePoint tempPoint : pointList) {
            if ("0".equals(tempPoint.getPARENTID())) {
                count++;
            } else {
                if (getItemIsExpand(tempPoint.getPARENTID())) {
                    count++;
                }
            }
        }
        return count;
    }

    @Override
    public Object getItem(int position) {
        return pointList.get(convertPosition(position));
    }

    private int convertPosition(int position) {
        int count = 0;
        for (int i = 0; i < pointList.size(); i++) {
            TreePoint treePoint = pointList.get(i);
            if ("0".equals(treePoint.getPARENTID())) {
                count++;
            } else {
                if (getItemIsExpand(treePoint.getPARENTID())) {
                    count++;
                }
            }
            if (position == (count - 1)) {
                return i;
            }
        }
        return 0;
    }

    /**
     * 判断当前Id的tempPoint是否已展开
     *
     * @param ID
     * @return
     */
    private boolean getItemIsExpand(String ID) {
        for (TreePoint tempPoint : pointList) {
            if (ID.equals(tempPoint.getID())) {
                return tempPoint.isExpand();
            }
        }
        return false;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        viewHolder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_item_classifylist, parent, false);
            viewHolder = new ViewHolder(convertView);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        TreePoint tempPoint = (TreePoint) getItem(position);
        int level = TreeUtils.getLevel(tempPoint, pointMap);

        viewHolder.ivImage.setPadding(25 * level, viewHolder.ivImage.getPaddingTop(), 0, viewHolder.ivImage.getPaddingBottom());
        if ((tempPoint.getISLEAF()).equals("0")) {
            //如果为父节点
            if (!tempPoint.isExpand()) {
                //不展开显示加号
                viewHolder.ivImage.setVisibility(View.VISIBLE);
                viewHolder.ivImage.setImageResource(R.mipmap.outline_list_collapse1);
            } else {
                //展开显示减号
                viewHolder.ivImage.setVisibility(View.VISIBLE);
                viewHolder.ivImage.setImageResource(R.mipmap.outline_list_expand1);
            }
        } else {
            //如果叶子节点,不占位显示
            viewHolder.ivImage.setVisibility(View.INVISIBLE);
        }

        if ((isHaveChildrenMap.get(tempPoint.getID())).equals("1")) {
            viewHolder.ivImage.setVisibility(View.INVISIBLE);
        } else {
            viewHolder.ivImage.setVisibility(View.VISIBLE);
        }

        viewHolder.tvName.setText(tempPoint.getNNAME());
        return convertView;
    }

    /**
     * Item 点击事件
     *
     * @param position
     */
    public void onItemClick(int position) {
        TreePoint treePoint = (TreePoint) getItem(position);
        if ((treePoint.getISLEAF()).equals("0")) {   //点击叶子节点
            if (treePoint.isExpand()) {
                for (TreePoint tempPoint : pointList) {
                    if (tempPoint.getPARENTID().equals(treePoint.getID())) {
                        if ("0".equals(treePoint.getISLEAF())) {
                            tempPoint.setExpand(false);
                        }
                    }
                }
                treePoint.setExpand(false);
            } else {
                treePoint.setExpand(true);
            }
        }
        this.notifyDataSetChanged();
    }

    static class ViewHolder {
        private TextView tvName;
        private ImageView ivImage;

        public ViewHolder(View convertView) {
            tvName = convertView.findViewById(R.id.Layout_Item_ClassifyList_tvName);
            ivImage = convertView.findViewById(R.id.Layout_Item_ClassifyList_ivImage);
        }
    }
}

三、获取网络APIJson数据并转换List集合数据格式

/**
 * 转换List格式
 *
 * @param tbClassifyList
 * @param parentId
 */
private void convertListFormat(List<Tb_Classify> tbClassifyList, String parentId) {
    for (int i = 0; i < tbClassifyList.size(); i ++) {
        Tb_Classify tb_classify = tbClassifyList.get(i);
        if (tb_classify.getChildren() != null) {
            treePoint = new TreePoint(tb_classify.getId() + "", tb_classify.getName()
                    , parentId, "0", i + 1);
            pointList.add(treePoint);
            isHaveChildrenMap.put(tb_classify.getId() + "", "0");
            convertListFormat(tb_classify.getChildren(), tb_classify.getId() + "");
        } else {
            treePoint = new TreePoint(tb_classify.getId() + "", tb_classify.getName()
                    , parentId, "0", i + 1);
            pointList.add(treePoint);
            isHaveChildrenMap.put(tb_classify.getId() + "", "1");
        }
    }
}

四、数据排序方法

/**
 * 对数据排序 深度优先
 */
private void updateData() {
    for (TreePoint treePoint : pointList) {
        pointMap.put(treePoint.getID(), treePoint);
        indexMap.put(treePoint.getNNAME(), treePoint.getID());
    }
    Collections.sort(pointList, new Comparator<TreePoint>() {
        @Override
        public int compare(TreePoint lhs, TreePoint rhs) {
            int lLevel = TreeUtils.getLevel(lhs, pointMap);
            int rLevel = TreeUtils.getLevel(rhs, pointMap);
            if (lLevel == rLevel) {
                if (lhs.getPARENTID().equals(rhs.getPARENTID())) {  //左边小
                    return lhs.getDISPLAY_ORDER() > rhs.getDISPLAY_ORDER() ? 1 : -1;
                } else {  //如果父辈id不相等
                    //同一级别,不同父辈
                    TreePoint lTreePoint = TreeUtils.getTreePoint(lhs.getPARENTID(), pointMap);
                    TreePoint rTreePoint = TreeUtils.getTreePoint(rhs.getPARENTID(), pointMap);
                    return compare(lTreePoint, rTreePoint);  //父辈
                }
            } else {  //不同级别
                if (lLevel > rLevel) {   //左边级别大       左边小
                    if (lhs.getPARENTID().equals(rhs.getID())) {
                        return 1;
                    } else {
                        TreePoint lReasonTreePoint = TreeUtils.getTreePoint(lhs.getPARENTID(), pointMap);
                        return compare(lReasonTreePoint, rhs);
                    }
                } else {   //右边级别大   右边小
                    if (rhs.getPARENTID().equals(lhs.getID())) {
                        return -1;
                    }
                    TreePoint rReasonTreePoint = TreeUtils.getTreePoint(rhs.getPARENTID(), pointMap);
                    return compare(lhs, rReasonTreePoint);
                }
            }
        }
    });
    treeAdapter.notifyDataSetChanged();
}

五、如何调用

treeAdapter = new TreeAdapter(mContext, pointList, pointMap, isHaveChildrenMap);
lvClassifyList.setAdapter(treeAdapter);
pointList.clear();
convertListFormat(classifyList, "0");
//打乱集合中的数据
Collections.shuffle(pointList);
//对集合中的数据重新排序
updateData();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF(Windows Presentation Foundation)是微软的一种用户界面技术,可用于创建各种Windows应用程序。TreeView是WPF的一种控件,用于显示层次结构的数据。 当我们需要自定义TreeView时,可以使用WPF提供的各种功能和特性来实现。下面是一些实现自定义TreeView的方法: 1. 自定义树节点的外观:可以使用WPF的样式和模板来修改树节点的外观,例如更改节点的背景颜色、字体样式等。可以使用TreeView控件的ItemTemplate属性来为每个节点定义一个数据模板。 2. 添加功能按钮:可以为TreeView控件添加自己需要的功能按钮,比如展开/折叠按钮、添加/删除节点按钮等。可以使用WPF的Button控件实现这些按钮,并与TreeView的事件关联。 3. 添加交互行为:可以通过使用WPF提供的命令功能,为TreeView控件添加交互行为。例如,可以为每个节点添加一个命令,当用户双击节点时执行该命令。 4. 实现节点的拖拽和放置:可以通过使用WPF的拖放功能,实现节点的拖拽和放置。可以为每个节点添加一个DragStarted事件,当用户拖动节点时触发该事件,并将节点的数据作为数据对象传递给拖动操作。同时,可以使用TreeViewDropTarget控件作为拖放目标,通过处理Drop事件实现节点的放置。 总的来说,WPF提供了丰富的功能和特性,使我们能够很容易地自定义TreeView控件。通过使用WPF的样式、模板、命令和拖放功能,我们可以实现一个完全符合我们需求的TreeView控件,并为用户提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值