J'ai mis en œuvre une petite application deux vérifier certains ExpandableListView
bugs que j'ai dans une application plus grande. J'ai lu et travaillé à travers this et that après. Mais alors j'ai décidé d'implémenter l'adaptateur ExpandableListView
sans le modèle ViewHolder dans la première exécution.Android ExpandableListView enfants interdépendants également sans ViewHolder
Mais j'ai toujours un bug lors de l'ouverture et la fermeture des vues parents. Voici mon MainActivity:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.exp_list_view);
List<Parent> parentList = new ArrayList<>();
Parent parent;
List<Child> childList;
childList = new ArrayList<>();
childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));
parent = new Parent("First", childList);
parentList.add(parent);
childList = new ArrayList<>();
childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));
parent = new Parent("Second", childList);
parentList.add(parent);
childList = new ArrayList<>();
childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));
parent = new Parent("Third", childList);
parentList.add(parent);
childList = new ArrayList<>();
childList.add(new Child("One")); childList.add(new Child("Two")); childList.add(new Child("Three"));
parent = new Parent("Forth", childList);
parentList.add(parent);
final MyAdapter adapter = new MyAdapter(this, parentList);
expandableListView.setAdapter(adapter);
}
}
Ma classe adaptateur:
class MyAdapter extends BaseExpandableListAdapter {
private final List<Parent> mParentList;
private final Context mContext;
public MyAdapter(final Context context, final List<Parent> parentList) {
mContext = context;
mParentList = parentList;
}
@Override
public int getGroupCount() {
return mParentList.size();
}
@Override
public int getChildrenCount(final int groupPosition) {
return mParentList.get(groupPosition).getChildList().size();
}
@Override
public Object getGroup(final int groupPosition) {
return mParentList.get(groupPosition);
}
@Override
public Object getChild(final int groupPosition, final int childPosition) {
return mParentList.get(groupPosition).getChildList().get(childPosition);
}
@Override
public long getGroupId(final int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(final int groupPosition, final int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView, final ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
v = inflater.inflate(R.layout.row_parent, parent, false);
}
TextView tvn = (TextView) v.findViewById(R.id.tv_parent_name);
tvn.setText(mParentList.get(groupPosition).getName());
return v;
}
@Override
public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, final View convertView, final ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
row = inflater.inflate(R.layout.row_child, parent, false);
}
TextView tvn = (TextView) row.findViewById(R.id.tv_child_name);
Switch sw = (Switch) row.findViewById(R.id.sw_child);
tvn.setText(mParentList.get(groupPosition).getChildList().get(childPosition).getName());
sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) {
Log.v(getClass().getName(), "onCheckedChanged() (" + groupPosition + ", " + childPosition + ")");
}
});
return row;
}
@Override
public boolean isChildSelectable(final int groupPosition, final int childPosition) {
return false;
}
Et mes deux classes de modèle. Parent:
public class Parent {
private String name;
private List<Child> childList = new ArrayList<>();
public Parent(final String name, List<Child> childList) {
this.name = name;
this.childList = childList;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
public List<Child> getChildList() {
return childList;
}
public void setChildList(final List<Child> childList) {
this.childList = childList;
}
}
enfant:
public class Child {
private String name;
public Child(final String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(final String name) {
this.name = name;
}
}
Maintenant, j'observe le problème suivant sur l'exécution de l'activité. S'il vous plaît suivre:
- développer tous les parents (de la première à FORTH)
- clic passe un et deux des parents deuxième et quatrième (de haut en bas)
- unexpand tous les parents (de la première à FORTH)
- unexpand tous les parents (de la première à FORTH)
observer:
- second parent: un seul et deux sont sélectionnés
- troisième parent: un, deux et trois sont sélectionnés
- vient parent: seulement deux est sélectionné
Qu'est-ce qui ne va pas ici? L'implémentation du pattern ViewHolder n'a pas fonctionné ici.