维护解体后/扩展状态N级或多级expandablelistview子群不显示 [英] After maintaining collapse/expand state for N-level or Multilevel expandablelistview some subgroups are not displayed

查看:298
本文介绍了维护解体后/扩展状态N级或多级expandablelistview子群不显示的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我做了很多创造** N级expandableListView。我能使其任何级别,但我的要求是,即使滚动后保持打开组的状态。我试着用多种方式,但仍然没有成功。

这可扩展的ListView是满足所有公司的要求比这个问题等。

This Expandable listview is meeting with all company requirement other than this issue.

*这是一种方式,我试过。我能保存状态的对象内,但一些子组没有得到显示。 *

我试着用onMeasure(宽,高)的方法来保持高度的时候动态生成的列表中,但仍然没能得到完美的一个。

I tried with onMeasure(width,height) method to maintain the height when dynamic generated list but still failed to get perfect one.

此外,我经历了许多文章是一样的。

Also i went through a number of articles for the same.

附我的工作的应用程序的截图。

Attached Screenshot of my working application..

下面是我的code。

public class ParentLevelAdapter extends BaseExpandableListAdapter {

        private Context context;
        private View convertView;
        Account account;
        private ArrayList<Model_Departments> list_departments;

        public ParentLevelAdapter (Context context,
                ArrayList<Model_Departments> list_departments, Account account) {
            this.context = context;
            this.list_departments = list_departments;
            this.account = account;
        }

        public void updateList(Context context,
                ArrayList<Model_Departments> list_departments, Account account) {
            notifyDataSetChanged();
        }

        @Override
        public Object getChild(int arg0, int arg1) {
            return this.getChild(arg0, arg1);
        }

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

        @Override
        public View getChildView(int groupPosition, int childPosition,
                boolean isLastChild, View convertView, ViewGroup parent)

        {
            final SecondLevelExpandableListView subGroupListView;
            SecondListView employeeLisView = null;

            if (convertView == null) {
                if (list_departments.get(groupPosition).hasSubGroups()) {
                    subGroupListView = new SecondLevelExpandableListView(
                            context);

                    subGroupListView.setGroupIndicator(null);
                    adap = new ParentLevelAdapter (context,
                            list_departments.get(groupPosition).subgroups,
                            account);
                    subGroupListView.setAdapter(adap);
                    return subGroupListView;
                } else {
                    employeeLisView = new SecondListView(context);
                    employeeLisView.setAdapter(new EmployeeAdapter(context,
                            list_departments.get

                            (groupPosition).employee, account));
                    return employeeLisView;
                }

            } else {
                if (list_departments.get(groupPosition).hasSubGroups()) {
                    if (convertView instanceof SecondLevelExpandableListView) {

                        subGroupListView = (SecondLevelExpandableListView) convertView;
                        subGroupListView.onMeasure(10000, 999999);

                        subGroupListView.setGroupIndicator(null);
                        adap = new ParentLevelAdapter (context,
                                list_departments.get(groupPosition).subgroups,
                                account);
                        subGroupListView.setAdapter(adap);
                        return subGroupListView;
                    } else {
                        subGroupListView = new SecondLevelExpandableListView(
                                context);
                        subGroupListView.setGroupIndicator(null);
                        adap = new ParentLevelAdapter (context,
                                list_departments.get(groupPosition).subgroups,
                                account);
                        subGroupListView.setAdapter(adap);
                        return subGroupListView;
                    }
                } else {
                    if (convertView instanceof SecondListView) {
                        employeeLisView = (SecondListView) convertView;
                        employeeLisView.setAdapter(new EmployeeAdapter(context,
                                list_departments.get(groupPosition).employee,
                                account));
                        return employeeLisView;
                    } else {
                        employeeLisView = new SecondListView(context);
                        employeeLisView.setAdapter(new EmployeeAdapter(context,
                                list_departments.get(groupPosition).employee,
                                account));
                        return employeeLisView;
                    }
                }
            }
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            // return list_departments.get(groupPosition).subgroups.size();
            return 1;

        }

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

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

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

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertV, ViewGroup parent) {
            convertView = convertV;
            // Log.v("ParentAdapter GroupView ",list_departments.get(groupPosition).name);
            if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.layout_icon_node, null);
                TextView text = (TextView) convertView
                        .findViewById(R.id.node_value);
                // text.setText("SECOND LEVEL");
                text.setText(list_departments.get(groupPosition).name);
            } else {
                TextView text = (TextView) convertView
                        .findViewById(R.id.node_value);
                text.setText(list_departments.get(groupPosition).name);
            }

            if (list_departments.get(groupPosition).isExpanded()) {
                Log.i("Group Position=", groupPosition + " NAme="
                        + list_departments.get(groupPosition).name);
                ((SecondLevelExpandableListView) parent)
                        .expandGroup(groupPosition);
            }


            /* code to save state for Group expand and collapse for individual objects*/
            ((SecondLevelExpandableListView) parent)
                    .setOnGroupExpandListener(new OnGroupExpandListener() {
                        @Override
                        public void onGroupExpand(int groupPosition) {
                            // TODO Auto-generated method stub
                            list_departments.get(groupPosition).setExpanded(
                                    true);
                            Log.i("Group", "Expand groupposition="
                                    + groupPosition);
                            Log.i("Group",
                                    "Expand"
                                            + list_departments
                                                    .get(groupPosition).name);
                        }
                    });

            ((SecondLevelExpandableListView) parent)
                    .setOnGroupCollapseListener(new OnGroupCollapseListener() {
                        @Override
                        public void onGroupCollapse(int groupPosition) {
                            // TODO Auto-generated method stub
                            list_departments.get(groupPosition).setExpanded(
                                    false);
                            Log.i("Group", "Collapse groupposition="
                                    + groupPosition);
                            Log.i("Group",
                                    "Collapse"
                                            + list_departments
                                                    .get(groupPosition).name);
                        }
                    });

            return convertView;
        }

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

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

我Pojo_Object:

public class Model_Departments implements Comparable<Model_Departments>{

    public String name;
    protected long parent_id;
    private boolean isexpanded;
    public boolean isExpanded() {
        return isexpanded;
    }


    public void setExpanded(boolean isexpanded) {
        this.isexpanded = isexpanded;
    }


    public ArrayList<Model_Departments> subgroups = new ArrayList<>();
    public ArrayList<Model_Employees> employee = new ArrayList<>();

    public Model_Departments(String department_name, long parent_id) {
        this.name = department_name;
        this.parent_id = parent_id;

    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public long getParent_id() {
        return parent_id;
    }

    public void setParent_id(long parent_id) {
        this.parent_id = parent_id;
    }

    public ArrayList<Model_Departments> getSubgroups() {
        return subgroups;
    }

    public void setSubgroups(ArrayList<Model_Departments> subgroups) {
        this.subgroups = subgroups;
    }

    public ArrayList<Model_Employees> getEmployee() {
        return employee;
    }

    public void setEmployee(ArrayList<Model_Employees> employee) {
        this.employee = employee;
    }

    public boolean hasEmployees() {
        if (employee != null && employee.size() > 0)
            return true;
        else
            return false;
    }

    public boolean hasSubGroups() {
        if (subgroups != null && subgroups.size() > 0)
            return true;
        else
            return false;
    }

    @Override
    public int compareTo(Model_Departments another) {

        if(this.hasSubGroups())
        {
            Collections.sort(this.subgroups);
        }
        return this.getName().compareTo(another.getName());
    }

}

Model_Employee.java

public class Model_Employees implements Comparable<Model_Employees>{
    public String name;
    public Model_Employees(String name, String location) {
        super();
        this.name = name;
    }
    public Model_Employees() {
        // TODO Auto-generated constructor stub
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }


    @Override
    public int compareTo(Model_Employees another) {
        return this.getName().compareTo(another.getName());
    }

}

在此先感谢。

Thanks in advance.

推荐答案

我以前有N级可扩展的ListView有同样的问题,我用的显示只有一个扩展项目的把戏。虽然它看起来并不像你的最佳解决方案,但是,希望它能帮助!

I have the same issue before with N-level Expandable ListView, I use a trick that displays only one expand item. Although it does not look like the best solution for you, however, hope it helps!

            // display only one expand item
            mExpandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
                int previousGroup = -1;
                @Override
                public void onGroupExpand(int groupPosition) {
                    if (groupPosition != previousGroup)
                        mExpandableListView.collapseGroup(previousGroup);
                    previousGroup = groupPosition;
                }
            });

secondLevelExpListView

更新:

另一种方式,你可以尝试如下(与上面 setOnGroupExpandListener ):

Another way you can try as the following (together with above setOnGroupExpandListener):

public class CustomExpListView extends ExpandableListView
{
    public CustomExpListView(Context context)
    {
        super(context);
    }
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        widthMeasureSpec = MeasureSpec.makeMeasureSpec(960, MeasureSpec.AT_MOST);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

然后在你的 ParentLevelAdapter 称之为:

    @Override
    public View getChildView(int groupPosition, int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        final CustomExpListView secondLevelExpListView = new CustomExpListView(this.mContext);
        String parentNode = (String) getGroup(groupPosition);
        secondLevelExpListView.setAdapter(new SecondLevelAdapter(this.mContext, mListData_SecondLevel_Map.get(parentNode), mListData_ThirdLevel_Map));
        secondLevelExpListView.setGroupIndicator(null);
        secondLevelExpListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
            int previousGroup = -1;
            @Override
            public void onGroupExpand(int groupPosition) {
                if (groupPosition != previousGroup)
                    secondLevelExpListView.collapseGroup(previousGroup);
                previousGroup = groupPosition;
            }
        });
        return secondLevelExpListView;
    }

如果你不想使用 setOnGroupExpandListener ,那么你就应该增加 heightMeasureSpec 这样的 heightMeasureSpec = MeasureSpec.makeMeasureSpec(20000,MeasureSpec.AT_MOST);

If you don't want to use setOnGroupExpandListener, then you should increase heightMeasureSpec like this heightMeasureSpec = MeasureSpec.makeMeasureSpec(20000, MeasureSpec.AT_MOST);

请注意,我只用3级可扩展列表视图测试,你可以阅读更多的在我的答案在以下问题:

Please note that I have only tested with 3-level expandable list view, you can read more at my answer at the following question:

<一个href="http://stackoverflow.com/questions/32880281/how-to-add-three-level-listview-in-expandablelistview-in-android/">How加三级的ListView在ExpandableListView在安卓

我已经发布了我的全部项目,以 GitHub上

I have posted my full project to GitHub

这篇关于维护解体后/扩展状态N级或多级expandablelistview子群不显示的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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