类似于TreeView Android的ExpandableListview

吉尔伯塔

嗨,我正在TreeView使用实施的人员ExpandableListView但是我有一些测量上的问题,不幸的是我无法解决。

这是问题的屏幕截图:

此图显示了肖申克的救赎之子

我可以看到这一个魔术师的孩子,但是来自肖申克的两个孩子在教父的领导下消失了。

您会看到测量存在问题。只要我是Android的新手,我就不会真正理解onMeasure()方法。我有1 ExpandableListView,在其中getChildView()我返回CustomExapndableListView-s。

这是代码:

ExpandableListAdapter:

public class ExpandableListAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> listDataHeader;
private HashMap<String, List<String>> listDataChild;

public ExpandableListAdapter (Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData) {
    this.context = context;
    this.listDataHeader = listDataHeader;
    this.listDataChild = listChildData;
}

@Override
public int getGroupCount() {
    return this.listDataHeader.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return this.listDataChild.get(this.listDataHeader.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return this.listDataHeader.get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return this.listDataChild.get(this.listDataHeader.get(groupPosition)).get(childPosition);
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    String headerTitle = (String) getGroup(groupPosition);
    Log.i("Header: ", " " + headerTitle);
    if(convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView.findViewById(R.id.lblListHeader);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);

    return convertView;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    /*final String childText = (String) getChild(groupPosition, childPosition);

    if(convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);

    txtListChild.setText(childText);*/

    String childText = (String) getChild(groupPosition, childPosition);
    if(listDataChild.containsKey(childText)){
        Log.i("Child", "" + childText);
        CustomExpandableListView explv = new CustomExpandableListView(context);
      //  explv.setRows(calculateRowCount((String)getGroup(groupPosition), null));
      //  ChildLayerExpandableListAdapter adapter = new ChildLayerExpandableListAdapter(context, listDataChild.get(getGroup(groupPosition)), listDataChild);
        Log.i("Opaaaa:", " " + getGroup(groupPosition));
        List<String> newHeaders = new ArrayList <String>();
        newHeaders.add(childText);
        // listDataChild.get(getGroup(groupPosition))
        ExpandableListAdapter adapter = new ExpandableListAdapter(context, newHeaders, listDataChild);
        explv.setAdapter(adapter);
        explv.setGroupIndicator(null);
        convertView = explv;
        convertView.setPadding(20, 0, 0, 0);
    }else{
      //  if(convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
   //     }

        Log.i("Else:", " " + childText);

        TextView txtListChild = (TextView) convertView.findViewById(R.id.lblListItem);

        txtListChild.setText(childText);

        convertView.setPadding(20, 0, 0, 0);
    }

    return convertView;
}

private int calculateRowCount (String key, ExpandableListView listView) {
    int groupCount = listDataChild.get(key).size();
    int rowCtr = 0;
    for(int i = 0; i < groupCount; i++) {
        rowCtr++;
        if( (listView != null) && (listView.isGroupExpanded(i)))
            rowCtr += listDataChild.get(listDataChild.get(key).get(i)).size() - 1;
    }
    return rowCtr;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

CustomExpandableListView:

    public class CustomExpandableListView extends ExpandableListView {

    private static final int HEIGHT = 20;
    private int rows;

    public void setRows(int rows) {
        this.rows = rows;
    }

    public CustomExpandableListView(Context context) {
        super(context);
    }

    public CustomExpandableListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(500, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      //  setMeasuredDimension(getMeasuredWidth(), rows * HEIGHT);
    }
}

我想做的是,当我放大视图时,我希望所有孩子都可以看到,并且可以向下滚动ListView现在,有些孩子被藏在不同的孩子下面。

在此先感谢您的帮助。

吉尔伯塔

@Code Word很抱歉,我忘了分享我的solution

如前所述,我实现treeViewListView这是我的source code

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

希望还为时不晚,source code对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

类似于MomentJS的Android Apps功能

来自分类Dev

类似于Android的iOS上的溢出菜单

来自分类Dev

类似于Android的iOS上的溢出菜单

来自分类Dev

类似于Android中的StorageItemAccessList功能

来自分类Dev

类似于C ++中Android的ArrayMap的容器

来自分类Dev

类似于Ramotion Paper Switch的Android库

来自分类Dev

类似于 android 中的 PageView 的元素

来自分类Dev

Android ProgressBar的样式类似于SwipeRefreshLayout中的进度视图

来自分类Dev

Android布局:评论活动类似于Facebook应用

来自分类Dev

使软键盘的行为类似于Android中的IOS

来自分类Dev

创建类似于iOS子视图的Android子视图

来自分类Dev

iOS是否具有类似于Android的RecyclerView的功能?

来自分类Dev

显示类似于Android中的本机来电屏幕的屏幕

来自分类Dev

Android List视图布局类似于Google Play

来自分类Dev

ListView类似于Android中的Google Play设置活动

来自分类Dev

类似于Android中的树状视图的可扩展ListView

来自分类Dev

类似于iphone音乐库的android图像库

来自分类Dev

Android GridView比例类型类似于html包含

来自分类Dev

Android EditText imeOptions使actionSearch的行为类似于actionDone?

来自分类Dev

是否有类似于Android中的stringByAppendingPathComponent的东西?

来自分类Dev

在Android中显示类似于菜单警报的警报

来自分类Dev

如何更改类似于Android中的图像的相对布局形状

来自分类Dev

如何在android中创建类似于fb的事件表单

来自分类Dev

Android - 用户添加的 ID 类似于“R.Drawable”的图像

来自分类Dev

获取类似于Android Studio内置Android Monitor的命令行“ adb logcat”输出

来自分类Dev

CoreData中是否可能有一对多关系的有损耦合类?(类似于@Embedded,类似于Android Room ORM)

来自分类Dev

在ObtainView的Android ExpandableListView NullPointerException

来自分类Dev

Android中的多级ExpandableListView

来自分类Dev

Android ExpandableListView setGroupIndicator?

Related 相关文章

  1. 1

    类似于MomentJS的Android Apps功能

  2. 2

    类似于Android的iOS上的溢出菜单

  3. 3

    类似于Android的iOS上的溢出菜单

  4. 4

    类似于Android中的StorageItemAccessList功能

  5. 5

    类似于C ++中Android的ArrayMap的容器

  6. 6

    类似于Ramotion Paper Switch的Android库

  7. 7

    类似于 android 中的 PageView 的元素

  8. 8

    Android ProgressBar的样式类似于SwipeRefreshLayout中的进度视图

  9. 9

    Android布局:评论活动类似于Facebook应用

  10. 10

    使软键盘的行为类似于Android中的IOS

  11. 11

    创建类似于iOS子视图的Android子视图

  12. 12

    iOS是否具有类似于Android的RecyclerView的功能?

  13. 13

    显示类似于Android中的本机来电屏幕的屏幕

  14. 14

    Android List视图布局类似于Google Play

  15. 15

    ListView类似于Android中的Google Play设置活动

  16. 16

    类似于Android中的树状视图的可扩展ListView

  17. 17

    类似于iphone音乐库的android图像库

  18. 18

    Android GridView比例类型类似于html包含

  19. 19

    Android EditText imeOptions使actionSearch的行为类似于actionDone?

  20. 20

    是否有类似于Android中的stringByAppendingPathComponent的东西?

  21. 21

    在Android中显示类似于菜单警报的警报

  22. 22

    如何更改类似于Android中的图像的相对布局形状

  23. 23

    如何在android中创建类似于fb的事件表单

  24. 24

    Android - 用户添加的 ID 类似于“R.Drawable”的图像

  25. 25

    获取类似于Android Studio内置Android Monitor的命令行“ adb logcat”输出

  26. 26

    CoreData中是否可能有一对多关系的有损耦合类?(类似于@Embedded,类似于Android Room ORM)

  27. 27

    在ObtainView的Android ExpandableListView NullPointerException

  28. 28

    Android中的多级ExpandableListView

  29. 29

    Android ExpandableListView setGroupIndicator?

热门标签

归档