我做了很多工作来创建** N级的可扩展列表视图.我能够做到任何级别,但我的要求是保持打开组的状态,即使滚动.我尝试了多种方式,但仍然没有成功.
此展开式列表视图满足除此问题之外的所有公司要求.
*这是我尝试的一种方式.我能够保存对象内的状态,但是很少的子组没有被显示出来. *
我尝试使用onMeasure(width,height)方法来维护动态生成列表时的高度,但仍然无法获得完美的一个.
另外我也经历了一些文章.
附加我的工作应用程序的屏幕截图..
这是我的代码
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,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,account); subGroupListView.setAdapter(adap); return subGroupListView; } else { subGroupListView = new SecondLevelExpandableListView( context); subGroupListView.setGroupIndicator(null); adap = new ParentLevelAdapter (context,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,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()); } }
提前致谢.
解决方法
我有与N级Expandable ListView相同的问题,我使用一个只显示一个展开项的技巧.但是,尽管它看起来不是最好的解决方案,但希望它有帮助!
// 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一起):
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,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);
请注意,我只测试了3级可扩展列表视图,您可以在以下问题的答案中阅读更多:
How to add Three Level ListView in ExpandableListView in android
我已将我的全部项目发布到GitHub