Primordial Android ArrayAdapter
Je veux faire une chose très simple. J'ai une listview dans ma demande qui je dynamiquement ajouter du texte. Mais, après un certain point, je voudrais changer la couleur du texte à l'intérieur de la liste. Alors, j'ai fait un XML de définition de mon personnalisée élément de liste et sous-classé le ArrayAdapter. Mais, à chaque fois que j'appelle la méthode add() sur mon custom ArrayAdapter, un élément est ajouté à la liste, mais le texte n'est pas placé en elle.
Voici mon XML: `
<TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/list_content" android:textSize="8pt"
android:gravity="center" android:layout_margin="4dip"
android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#FF00FF00"/>
Et mon ArrayAdapter sous-classe:
private class customAdapter extends ArrayAdapter<String> {
public View v;
public customAdapter(Context context){
super(context, R.layout.gamelistitem);
}
@Override
public View getView(int pos, View convertView, ViewGroup parent){
this.v = convertView;
if(v==null) {
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v=vi.inflate(R.layout.gamelistitem, null);
}
if(timeLeft!=0) {
TextView tv = (TextView)v.findViewById(R.id.list_content);
//tv.setText(str[pos]);
tv.setTextColor(Color.GREEN);
}
else {
TextView tv = (TextView)v.findViewById(R.id.list_content);
//tv.setText(str[pos]);
tv.setTextColor(Color.RED);
}
return v;
}
}
Je suis sûr que je suis en train de faire quelque chose de terriblement mal, mais je suis encore un peu nouveau pour Android.
Merci!
`
OriginalL'auteur strange quark | 2011-03-03
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de mettre le texte en
getView()
. Obtenir la valeur de définir avecgetItem(pos)
, puis le mettre.Aussi, est-il une raison pour laquelle vous êtes le stockage
v
comme une variable membre, plutôt que juste à l'intérieur de la fonction?Ah. C'est une des belles choses au sujet de l'extension complète de la classe comme ArrayAdapter. Il prend en charge pratiquement tout ce dont vous avez besoin (comme
add()
), et vous pouvez vous soucier seulement l'impair de bits comme des données personnalisées ou des vues personnalisées.Je n'ai pas eu une chance de jouer trop avec ListView (je suis débutant), mais à partir de ma compréhension de ce que vous faites et comment ListView travaille, je peux voir un autre problème potentiel. Ce que je comprends, ListView recycle les points de vue, donc si vous êtes à la vérification de la valeur de timeLeft lorsque la vue est ajouté, les anciens éléments peut changer du vert au rouge à mesure que l'utilisateur fait défiler en haut et en bas. Si cela se produit, peut-être envisager d'utiliser un objet qui contient à la fois la Chaîne et le courant timeLeft quand il est créé, plutôt que de tout simplement les Cordes?
Ouais, je vais avoir le problème où tous les objets allume en rouge une fois timeLeft est égal à 0. Comment puis-je surmonter cela? Puis-je avoir ListView pas recycler la vue?
Je serais probablement utiliser une petite classe qui détient à la fois la Chaîne et le courant timeLeft valeur. Qui aurait besoin d'une
Array<MyClass>
et s'étendant à partir deArrayAdapter<MyClass>
, mais peut entraîner des modifications mineures àgetView()
. Si il n'y a pas moyen de contourner le calcul de timeLeft au sein de l'adaptateur, unadd(String)
méthode pourrait être ajouté pour créer un nouvel objet Maclasse (à l'aide de la Corde et le courant timeLeft) et d'appeleradd(MyClass)
(qui ne seraient toujours pas remplacée). De cette façon, vous êtes l'enregistrement lorsque le est ajoutée, et non lors de la vue est ajouté.OriginalL'auteur erichamion