Comment utiliser deux Viewholders dans un seul adaptateur
-
23-12-2019 - |
Question
Je suis confronté à un problème lors de l'utilisation de la section dans une liste.J'ai besoin d'utiliser viewholder pour rendre le défilement listview fluide, mais je ne sais pas comment implémenter deux viewholders car il y a deux vues séparées, l'une est une section et la seconde est une entrée simple. Voici le code que j'ai essayé et l'erreur que j'ai eue. S'il vous plaît dites-moi où je fais une erreur et comment puis-je la corriger :
CODE
@
Override
public View getView(int position, View convertView, ViewGroup parent) {
final GroupAccountdto i = items.get(position);
if (i != null) {
if (i.isSection()) {
if (convertView == null) {
convertView = vi.inflate(R.layout.list_group_section, null);
ViewHolderGroup group_holder = new ViewHolderGroup();
group_holder.group_name = (TextView) convertView.findViewById(R.id.list_section_group_name);
convertView.setTag(group_holder);
}
ViewHolderGroup group_holder = (ViewHolderGroup) convertView.getTag();
GiddhGroups si = (GiddhGroups) i;
group_holder.group_name.setText(si.getGroupname());
} else {
if (convertView == null) {
convertView = vi.inflate(R.layout.list_item_account, null);
ViewHolderAccount account_holder = new ViewHolderAccount();
account_holder.account_name = (TextView) convertView.findViewById(R.id.list_item_account_name);
account_holder.account_bal = (TextView) convertView.findViewById(R.id.list_item_account_balance);
}
ViewHolderAccount account_holder = (ViewHolderAccount) convertView.getTag();
GiddhAccounts ei = (GiddhAccounts) i;
if (account_holder.account_name != null)
account_holder.account_name.setText(ei.getAccountName());
if (account_holder.account_bal != null)
account_holder.account_bal.setText(ei.getBalance());
}
}
return convertView;
}
static class ViewHolderGroup {
TextView group_name;
}
static class ViewHolderAccount {
public TextView account_name;
public TextView account_bal;
}
ERREUR
02-27 12:49:28.461: E/AndroidRuntime(20200): java.lang.ClassCastException: adapters.GroupAccountAdapter$ViewHolderGroup cannot be cast to adapters.GroupAccountAdapter$ViewHolderAccount
02-27 12:49:28.461: E/AndroidRuntime(20200): at adapters.GroupAccountAdapter.getView(GroupAccountAdapter.java:53)
02-27 12:49:28.461: E/AndroidRuntime(20200): at android.widget.AbsListView.obtainView(AbsListView.java:2334)
02-27 12:49:28.461: E/AndroidRuntime(20200): at android.widget.ListView.measureHeightOfChildren(ListView.java:1409)
02-27 12:49:28.461: E/AndroidRuntime(20200): at android.widget.ListView.onMeasure(ListView.java:1273)
La solution
Vous devez remplacer getItemViewType()
dans ton ListAdapter
, renvoyant un nombre distinct pour chaque type de ligne.Dans votre cas, vous pourriez revenir 0
pour les sections et 1
pour les lignes régulières.Alors, getView()
sera appelé avec le bon View
type pour le recyclage.
@Override
public int getItemViewType(int position) {
if (getItem(position).isSection()) {
return(0);
}
return(1);
}