Я много работал, чтобы создать ** расширяемыйListView N-уровня. Я могу сделать это на любом уровне, но мое требование - поддерживать состояние открытых групп даже после прокрутки. Я пробовал несколько способов, но все же безуспешно.
Этот расширяемый список соответствует всем требованиям компании, кроме этой проблемы.
* Это один из способов, который я пробовал. Я могу сохранять состояния внутри объектов, но мало подгрупп не отображаются. *
Я попытался использовать метод onMeasure (ширина, высота), чтобы поддерживать высоту в динамическом сгенерированном списке, но все еще не получился идеальным.
Также я просмотрел ряд статей для того же самого.
Прикрепленный снимок экрана моего рабочего приложения..
Вот мой код.
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;
}
}
My 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());
}
}
Спасибо заранее.