Android personnalisé ArrayAdapter méthode getView appelé plusieurs fois la réinitialisation dynamique TextView valeur
La méthode getView dans mon custom ArrayAdapter est appelé plusieurs fois, ce qui je suppose qu'il est censé. Problème, j'ai une quantité TextView qui est de définir de façon dynamique, mais lorsque vous faites défiler et la boîte se passe hors de l'écran, la valeur disparaît. Je ne suis pas sûr de ce que je fais de mal et Google ne s'avère pas être une grande aide. J'espère que quelqu'un ici peut m'aider.
L'adapater est appelé:
adapter = new MenuAdapter(thisActivity, R.layout.menu, list);
setListAdapter(adapter);
Mon Custom ArrayAdapter:
public MenuAdapter(Context context, int textViewResourceId, ArrayList<Object> menu) {
super(context, textViewResourceId, menu);
this.menu = menu;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
Object cat = menu.get(position);
if (cat.getClass().equals(Category.class)) {
v = vi.inflate(R.layout.category, null);
Category item = (Category)cat;
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
TextView tt = (TextView) v.findViewById(R.id.category);
tt.setText(item.getName());
} else if (cat.getClass().equals(OrderItem.class)) {
v = vi.inflate(R.layout.menu, null);
OrderItem orderItem = (OrderItem)cat;
Item item = orderItem.getItem();
TextView tt = (TextView) v.findViewById(R.id.title);
tt.setText(item.getName());
TextView bt = (TextView) v.findViewById(R.id.desc);
bt.setText(item.getDescription());
TextView qty = (TextView) v.findViewById(R.id.qty);
qty.setId(item.getId());
ImageButton minus = (ImageButton) v.findViewById(R.id.qtyMinus);
minus.setTag(item);
ImageButton plus = (ImageButton) v.findViewById(R.id.qtyPlus);
plus.setTag(item);
}
return v;
}
Le menu mise en page:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip"
android:background="#FFFFFF">
<RelativeLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent"
android:cacheColorHint="#FFFFFF"
android:background="#FFFFFF">
<TextView
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_vertical"
android:textSize="16px"
android:textColor="#000000"
/>
<TextView
android:id="@+id/desc"
android:layout_below="@id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="11px"
android:textStyle="italic"
android:textColor="#000000"
/>
</RelativeLayout>
<ImageButton
android:id="@+id/qtyMinus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/minus"
android:paddingTop="15px"
android:onClick="minusQty" />
<TextView
android:id="@+id/qty"
android:layout_width="50px"
android:layout_height="50px"
android:textColor="#000000"
android:textSize="18px"
android:gravity="center_vertical|center_horizontal"
android:freezesText="true"
android:background="@android:drawable/editbox_background"/>
<ImageButton
android:id="@+id/qtyPlus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/plus"
android:paddingTop="15px"
android:onClick="addQty" />
</LinearLayout>
Toute aide sera grandement appréciée.
Merci Beaucoup.
Do u 2 types de vues? Comme vous avez un Élément de la Catégorie et le poste de Commande? Si c'est vrai alors vous avez besoin de changer la façon dont u r les manipulent. Vos besoins de conception un peu plus de travail.
OriginalL'auteur Paul Blundell | 2012-03-24
Vous devez vous connecter pour publier un commentaire.
getView()
sera appelée plusieurs fois comme vous le notez. il ne devrait pas, parce que votre adaptateur tableau est basé sur l'état interne du modèle de données (tableau, liste d'objets, peu importe).getView()
devrait être idempotent dans que de l'appeler à plusieurs reprises de ne pas changer le résultat.vous dites "lorsque vous faites défiler et la boîte se passe hors de l'écran, la valeur disparaît". remarque assurez-vous ce que veux dire. lorsque vous faites défiler une des vues générées dans
getView()
hors de la zone visible, et quand vous faites défiler en arrière, la valeur est différente? sans autre information, je dois dire que c'est pas possible. la raison en est encore qu'à moins que vous êtes en train de modifier l'état interne de l'adaptateur ou du changement de l'adaptateur, il se produira toujours le même point de vue pour un poste donné.par la voie,
convertView
peut être null, si vous voulez faire quelque chose comme,une possibilité est que ce type d'objet dans votre "menu" de la collection dans votre carte n'est ni une catégorie ou d'un poste de commande. pas sûr de savoir comment cela se passerait-il si. je vous recommande d'ajouter les journaux de getView() de sorte que vous pouvez voir exactement ce que vous générez pour chaque poste, pour chaque appel. la seule façon dont la vue pourrait être vide est si vous générez une vue vide.
ce qui est bizarre est que si j'ajoute l'instruction if pour vérifier v est nulle avant de gonfler, quand j'ai faites défiler vers le bas de la liste, j'obtiens une exception de pointeur null sur cette ligne: tt.setText(item.getName()); des idées?
oui, c'est de la colombie-britannique, de l'arrangement de votre getView(). vous fait gonfler l'un des deux points de vue différents selon le type d'objet que le soutien de l'. le convertir à venir est probablement pas le type de vue que vous en pensez, donc les éléments que vous accédez ne sont pas mis. ce n'est pas un modèle que j'ai vu avant. je recommande d'avoir une vue unique, où vous rendre sur la section ou l'autre visible selon le type d'objet. c'est probablement une source de vos problèmes, mais je ne peux pas dire à coup sûr.
Je vous remercie. À partir de ce que vous m'avez dit je l'ai changé pour une vue unique qui finalement m'a pris dans la bonne direction pour résoudre le problème. Merci beaucoup.
OriginalL'auteur Jeffrey Blattman
Dans votre listview ensemble
android:height = "match_parent"
. Maintenantgetview
appelé votre jeu de données de comptage. on peut réutiliser leconvertview
. De vérifier laconvertview
si c'estNULL
gonfler votre point de vue. Sinon, écrivez votre code restant.OriginalL'auteur Reeganth A