Ho lavorato molto per creare ** N livello espandibileListView. Sono in grado di raggiungere qualsiasi livello, ma il mio requisito è quello di mantenere lo stato dei gruppi aperti anche dopo lo scorrimento. Ho provato con diversi modi, ma ancora senza successo.Dopo aver mantenuto lo stato di compressione/espansione per N-level o Multilevel, espandere la visualizzazione di alcuni sottogruppi.
Questa listview espandibile soddisfa tutti i requisiti aziendali diversi da questo problema.
* Questo è un modo, che ho provato. Sono in grado di salvare gli stati all'interno degli oggetti ma pochi sottogruppi non vengono visualizzati. *
Ho provato con il metodo onMeasure (larghezza, altezza) per mantenere l'altezza quando elenco dinamico generato ma non è riuscito a ottenere uno perfetto.
Inoltre ho esaminato un certo numero di articoli per lo stesso.
screenshot allegato della mia applicazione di lavoro ..
Ecco il mio codice.
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;
}
}
mio 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());
}
}
Grazie in anticipo.
ragazzi plz aiuto siamo Strug ho letto questo problema da molto tempo – Pratswinz
ho usato la variabile isexpanded per salvare lo stato con ogni gruppo a qualsiasi livello. inizialmente è falso e ongroupexpand listener lo sto rendendo vero e oncollapselistener lo sto rendendo falso. Funziona ma durante il caricamento durante lo scrool nasconde alcuni gruppi. Dopo aver fatto clic su un altro sottogruppo è stato visualizzato. –
Forse sarebbe meglio usare la libreria TreeView - https://github.com/bmelnychuk/AndroidTreeView – Oleksandr