2011-06-21 2 views
0

Ma classe étend SimpleCursorAdapter. Dans cette classe, j'essaie de se CallLog dans ListView (avec trois TextViews (numéro, nom et date) et deux ImageViews (qui représente les appels entrants et sortants)Custom CursorAdapter, ListView est en décalage

Mon code dans la méthode OnCreate:.

Cursor c = getContentResolver().query(android.provider.CallLog.Calls.CONTENT_URI, null, "TYPE IN (\"1\",\"2\")", null, "DATE DESC"); 
    startManagingCursor(c); 

    String[] from = new String[] {"number", "name" , "_ID" }; 
    int[] to = new int[] {R.id.number, R.id.name, R.id.duration}; 
    listNotImported=(ListView)findViewById(R.id.ListOfNotImportedCalls); 
    listNotImported.setOnItemClickListener(this); 
    list1Adapter5 = new IconicAdapter5(this, R.layout.rownotimportedcalls, c, from, to); 
    listNotImported.setAdapter(list1Adapter5); 

ma classe:

class IconicAdapter5 extends SimpleCursorAdapter 
{ 


    public IconicAdapter5(Context context, int layout, Cursor c, String[] from, int[] to) 
    { 
     super(context, layout, c, from, to); 
    } 
    public View newView(Context context, Cursor c, ViewGroup parent) 
    { 
     rowNotImported = super.newView(CallLog.this, c, parent); 
     String duration= c.getString(c.getColumnIndex("DURATION")); 
     ((TextView)rowNotImported.findViewById(R.id.duration)).setText(duration); 
     return (rowNotImported); 
} 

colonnes « numéro », « name », « _ID » fonctionne très bien, tout est ok, mais la durée, et une autre colonne, que j'essaie d'obtenir du curseur (par exemple, la « durée ») dans. La méthode newView est en train de changer jwei512 du blog ThinkAndroid (http://thinkandroid.wordpress.com/2010/01/11/custom-cursoradapters/) a écrit à ce sujet, mais je ne comprends toujours pas comment je peux mettre à mon avis des colonnes calculées, et d'autres colonnes dans la méthode newView.

Je suis confus, parce que je ne peux pas trouver de solution sur internet. S'il vous plaît, aidez-moi. "Ensuite, vous remarquerez un comportement étrange - à savoir, vous verrez les noms commencer à se déplacer lorsque vous faites défiler la liste vers le haut et vers le bas.Ce qui se passe est que si vous instanciez et placez quelque chose Dans votre TextView, rien dans la méthode bindView n'est lié à certains TextViews et donc au changement de position, donc si vous voyez des choses se déplacer dans vos listes, alors c'est un gros drapeau à faire. Assurez-vous de lier les choses à toutes vos vues dans vos méthodes newView et bindView. "

XML représentant ma ligne:

<TableLayout android:layout_alignParentLeft="true" 
    android:layout_alignBaseline="@+id/myTable" android:id="@+id/myTable" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:stretchColumns="0" 
    android:shrinkColumns="yes"> 


    <TableRow> 

    <TextView 
    android:id="@+id/name" 
    android:textSize="18dp" 
    android:textColor="@color/white" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    </TextView> 

    <ImageView 
    android:layout_width="20dp" 
    android:layout_height="20dp" 
    android:id="@+id/imageViewType"> 
    </ImageView> 

    </TableRow> 




    <TableRow> 
    <LinearLayout> 
    <TextView 
    android:id="@+id/headerNumber" 
    android:textColor="@color/white" 
    android:textSize="12sp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    </TextView> 


    <TextView 
    android:id="@+id/number" 
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dip" 
    > 
    </TextView> 
    </LinearLayout> 
    </TableRow> 

     <TableRow> 
    <LinearLayout> 
    <TextView 
    android:id="@+id/headerDate" 
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    </TextView> 
    <TextView 
    android:id="@+id/date" 
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dip" > 
    </TextView> 

    </LinearLayout> 
    </TableRow> 


    <TableRow> 
    <LinearLayout> 
    <TextView 
    android:id="@+id/headerDuration" 
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 

    </TextView> 
    <TextView 
    android:id="@+id/duration" 
    android:textColor="@color/white" 
    android:textSize="12dp" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="5dp" > 
    </TextView> 

    </LinearLayout> 
    </TableRow> 



    </TableLayout> 

+0

d'après ce que je comprends est que vous devez définir _something_ aux vues du NewView et bi ndView.Essayez de définir la durée TextView à une chaîne vide par exemple (ou un seul espace) si vous n'avez pas de données à placer dans bindView ou newView. – Audrius

+0

Merci Audrius, je l'ai fait comme ça (cela n'a pas aidé) \t \t \t \t ** si (durée == null) durée = getText (R.string.unknown) .toString(); ** –

+0

OK, peut vous expliquez ce que vous voulez dire par "déplacement"? Les éléments de la liste de sélection changent-ils de position de façon sporadique ou les vues de contenu d'élément de liste sont-elles redimensionnées lors du défilement? – Audrius

Répondre

0

Je ne sais pas si j'unerstand vraiment question, mais lieu convinient pour faire tous les calculs est la méthode surchargée setViewText()

private class MyCursorAdapter extends SimpleCursorAdapter { 



    private Date d = new Date(); 

    @Override 
    public void setViewText(TextView v, String text) { 
     if (v.getId() == R.id.TrackTime) { 
      d.setTime(Long.parseLong(text)); 
      text = d.toLocaleString(); 
     } 
     super.setViewText(v, text); 
    } 
} 
+0

Fonctionne avec la date (maintenant je peux le déclarer dans le paramètre FROM) et convertir –

+0

Jetez un oeil à la documentation - il existe aussi une méthode publique void setViewImage (ImageView v, String value) appelée quand les données sont passé à ImageView – piotrpo

+0

Pourriez-vous jeter un oeil à ma méthode? Je lis docs, mais ne peux toujours pas faire le code de travail Mes valeurs se déplacent à nouveau (quand je mets ImageView) *** public void setViewImage (ImageView v, Valeur chaîne) \t { \t \t si (v.getId() == R.id.imageViewType) \t \t { \t \t \t \t if (value.equals ("1") == true) \t \t \t \t \t \t value = "R.drawable.sym_call_incoming"; \t \t \t \t \t if (value.equals ("2") == true) \t \t \t \t \t \t value = "R.drawable.sym_call_outgoing"; \t \t \t} \t \t super.setViewImage (v, valeur); \t} –

0

Avez-vous mis en œuvre par Bindview() méthode depuis la mise à jour des lignes de cette méthode est appelée. Si ce n'est pas le cas, remplacez-le et récupérez les données de la base de données.

+0

Oui, cette méthode a le même code que newView –

0

à mon humble avis pour le faire à droite:

  1. Bindview() n'est pas nécessaire. newView

  2. Chaque valeur doit être déclarée dans String [] à partir de.

  3. si vous voulez effectuer des opérations sur TextViews vous devez utiliser setViewText (TextView v, texte String) (piotrpo thanks)

4.Si vous voulez faire des opérations sur ImageViews utilisent ce code (par exemple, vous voulez des images différentes pour les appels entrants et sortants)

class IconicAdapter5 extends SimpleCursorAdapter 
{ 
    private int source = 0; 

    @Override 
    public void setViewImage (ImageView v, String value) 
    { 
     if (v.getId() == R.id.imageViewType) 
      { 
       if(value.equals("1") == true) 
       { 
        source= (R.drawable.sym_call_incoming); 
       } 

       if(value.equals("2") == true) 
       { 
        source= (R.drawable.sym_call_outgoing); 
       } 
      } 
     v.setImageResource(source); 
    } 

}

Questions connexes