2017-06-27 1 views
0

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:

  1. développer tous les parents (de la première à FORTH)
  2. clic passe un et deux des parents deuxième et quatrième (de haut en bas)
  3. unexpand tous les parents (de la première à FORTH)
  4. 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.

Répondre

0

je devais deux choses:

  1. étendons l'enfant avec l'Etat et le suivre
  2. Débarrassez-vous des instructions if dans les getChildView() et getGroupView

Ma nouvelle classe enfant maintenant est:

public class Child { 
    private String name; 
    private boolean state; 

    public Child(final String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 

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

    public boolean isState() { 
     return state; 
    } 

    public void setState(final boolean state) { 
     this.state = state; 
    } 
} 

Mon nouveau getChildView() méthode:

@Override 
public View getChildView(final int groupPosition, final int childPosition, final boolean isLastChild, final View convertView, final ViewGroup parent) { 
    View view = layoutInflater.inflate(R.layout.child_row, parent, false); 

    final Switch sw = (Switch) view.findViewById(R.id.sw); 
    TextView textViewChildName = (TextView) view.findViewById(R.id.childname); 


    String name = ((Child) getChild(groupPosition, childPosition)).getName(); 

    sw.setChecked(list.get(groupPosition).getChildList().get(childPosition).isState()); 

    textViewChildName.setText(name); 

    sw.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(final CompoundButton buttonView, final boolean isChecked) { 
      list.get(groupPosition).getChildList().get(childPosition).setState(isChecked); 
      sw.setChecked(isChecked); 
     } 
    }); 

    return view; 
} 

Et enfin getGroupView():

@Override 
public View getGroupView(final int groupPosition, final boolean isExpanded, final View convertView, final ViewGroup parent) { 
    View view = layoutInflater.inflate(R.layout.group_row, parent, false); 
    TextView textView = (TextView) view.findViewById(R.id.groupname); 

    String name = ((Parent) getGroup(groupPosition)).getName(); 
    textView.setText(name); 

    return view; 
} 

je devais quitter avec le motif ViewHolder. Cela ne fonctionne pas pour moi parce que j'utilise le commutateur et que je veux garder l'état.