2010-12-20 4 views
0

Salut tout le monde Je ne suis pas un codeur professionnel, mais j'ai joué avec une simple liste de choses à faire pour apprendre les bases du développement android.Problème de couleur ListView

J'ai été capable d'obtenir à peu près tout ce que je veux travailler, mais il y a un problème avec ma listview qui m'a complètement dérouté. J'ai étendu SimpleCursorAdapter afin de formater les données provenant de ma base de données sqlite et de changer la couleur du texte deededate selon si le duedate a expiré ou non. Le formatage fonctionne parfaitement, mais je reçois des résultats bizarres avec les couleurs. Les premières entrées de la liste ressemblent à ce que je les attend, mais lorsque je défile vers le bas, des incohérences commencent à apparaître lorsque les éléments sans date d'échéance sont colorés en rouge ou en vert. Plus je défile vers le haut et vers le bas dans la liste, plus les incohérences apparaissent jusqu'à ce que finalement chaque ligne soit colorée, qu'elle le soit ou non. Est-ce que quelqu'un peut m'aider à comprendre ce qui se passe ici? S'il vous plaît voir mon adaptateur personnalisé ci-dessous.

public class ProAdapter2 extends SimpleCursorAdapter { 
    private static int[] TO = {R.id.priority, R.id.projectname, R.id.duedate}; 
    private static String[] FROM = {"priorities", "projectName", "dueDate"}; 
    private Context context; 
    private int layout; 

    //constructor 
    public ProAdapter2(Context context, int layout, Cursor c) { 
    super(context,layout, c, FROM, TO); 
    this.context=context; 
    this.layout = layout; 
    }  

    @Override 
    public View newView(Context context, Cursor curso, ViewGroup parent){ 
    Cursor c = getCursor(); 
    final LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(layout, parent, false); 
    TextView txtName = (TextView) v.findViewById(R.id.projectname); 
    txtName.setText(c.getString(1)); 
    TextView txtPriority = (TextView) v.findViewById(R.id.priority); 
    txtPriority.setText(c.getString(2)); 

    return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
    TextView txtDueDate = (TextView) v.findViewById(R.id.duedate); 
    TextView txtDueDateLabel = (TextView) v.findViewById(R.id.duedate_label); 
    TextView txtPriority = (TextView) v.findViewById(R.id.priority); 
    TextView txtPriorityLabel = (TextView) v.findViewById(R.id.priority_label); 
    TextView txtName = (TextView) v.findViewById(R.id.projectname); 

    LinearLayout pridate = (LinearLayout) v.findViewById(R.id.pridate); 

    String dueDate = c.getString(3); 
    String cDate = c.getString(4); 
    String dueDateFormated; 

    MyTime t = new MyTime(); 
    Long cTimeLong = c.getLong(6); 
    Long dTimeLong = c.getLong(5); 

    dueDateFormated = t.getFormatedTime(c.getString(3));  
    txtDueDate.setText(dueDateFormated); 

    if (c.getInt(5)==0){ 
     txtDueDate.setText("Not Set"); 
    } 
    else if (cTimeLong < dTimeLong){  
     txtDueDate.setTextColor(Color.GREEN); 
    } 
    else if (cTimeLong > dTimeLong){ 
     txtDueDate.setTextColor(Color.RED); 
    } 
    } 
} 

image http://i.stack.imgur.com/bt4Z8.png

+0

n'a pas compris ce que font u si les conditions d'autre ??? pouvez-vous expliquer .. – viv

+0

Ma base de données stocke la date d'échéance dans le format d'époque Unix, le nombre de secondes depuis le 1er janvier 1970. SQL rend également facile d'obtenir l'heure actuelle dans Unix temps, il est donc facile de comparer 2 dates et comprendre qui est le plus âgé. – user548369

Répondre

0

La solution la plus simple serait d'ajouter ce qui suit après txtDueDate.setText("Not Set");:

txtDueDate.setTextColor(Color.BLACK); 

La raison en est qu'un ListView recycle les objets View vous créez dans la méthode newView.

Alors, quand bindView est appelé, le paramètre v est pas toujours un brillant nouvel objet View, mais en fait un à partir du haut de la liste qui n'est pas plus visible, et avait donc déjà le texte en vert ou rouge .

Vous devez donc vous assurer de définir explicitement toutes les propriétés dont vous avez besoin, y compris la couleur du texte. En plus de cela, il existe d'autres optimisations que vous pouvez faire. Par exemple, vous ne devriez pas appeler setText dans votre newView méthode — vous devriez seulement le faire dans la méthode de liaison.

Pour une bonne information sur la façon dont les œuvres ListView, vous pouvez regarder cette conversation ou regarder les diapositives PDF:
http://www.google.com/events/io/2010/sessions/world-of-listview-android.html

+0

Ça l'a fait! Je me suis battu avec ça pendant quelques heures tous les deux jours pensant que je finirais par comprendre, mais j'étais loin de comprendre pourquoi cela se passait. Recycling Views répond à beaucoup de questions que j'ai eu à propos de ListViews, merci. C'est mon premier article ici, y a-t-il un moyen de le fermer ou de le résoudre? – user548369

+0

vous pouvez accepter la réponse de cet utilisateur ...... – viv