Question

J'utilisais SimpleCursorAdapter avec un fichier xml avec des vues qui y sont définis:

<LinearLayout ...>
    <ImageView android:id="@+id/listIcon" />
    <TextView android:id="@+id/listText" />
</LinearLayout>

Mon but était de définir la couleur du texte du TextView, et la couleur de fond de la LinearLayout (qui est, chaque ligne de la ListView) par programme; la couleur est retournée à partir d'une base de données.

Je recevais NPE en essayant de manipuler le TextView par exemple, après avoir trouvé aucune plainte à formuler:

TextView tv = (TextView) findViewById(R.id.listText);
tv.setTextColor(color); // NPE on this line

Ce qui est juste; s'il y a plusieurs entrées dans la liste, il est raisonnable de supposer que « R.id.listText » ne fonctionnera pas. Donc, j'ai étendu SimpleCursor Adaptateur:

public View getView(int position, View convertView, ViewGroup parent) {
    View row = super.getView(position, convertView, parent);
    TextView text = (TextView) row.findViewById(R.id.listText);
    // ImageView icon = (ImageView) row.findViewById(R.id.listIcon);

    // If there's an icon defined
    if (mIcon_id != 0) {
        // icon.setImageResource(mIcon_id);
    }

    // If text color defined
    if (mTextColor != 0) {
        text.setTextColor(mTextColor);
    }

    // If background color set
    if (mBackgroundColor != 0) {
        row.setBackgroundColor(mBackgroundColor);
    }
    return(row);
}

Je reçois deux erreurs différentes:

  • Une NPE similaire est jeté à " text.setTextColor (mTextColor) "
  • Si les lignes avec le ImageView sont décommentée, je reçois un « ClassCastException: android.widget.TextView » où je suis appel " row.findViewById (R.id.listIcon) "

Pour référence, je tentais d'utiliser un exemple de code de Commonsware, l'appliquer à ma situation. le lien de


Changement à ceci:

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = super.getView(position, convertView, parent);

    if (convertView == null) convertView = View.inflate(mContext, R.layout.theme_item, null);
    TextView text = (TextView) convertView.findViewById(R.id.listText_tv);
    ImageView icon = (ImageView) convertView.findViewById(R.id.listIcon_iv);

    // If there's an icon defined
    if (mIcon_id != 0) {
        icon.setImageResource(mIcon_id);
    }

    // If text color defined
    if (mTextColor != 0) {
        text.setTextColor(mTextColor);
    }

    // If background color set
    if (mBackgroundColor != 0) {
        convertView.setBackgroundColor(mBackgroundColor);
    }
    bindView(convertView, mContext, mCursor);
    return(convertView);
}

Maintenant, je reçois un ClassCastException dans l'activité suivante (cliquez sur un élément de liste). Rien n'a été modifié dans la prochaine activité; il a travaillé lors de l'utilisation d'un SimpleListAdapter pour la liste qui avait entrées (sur laquelle clic conduirait à Activity2), donc je pense qu'il est encore quelque chose que je fais mal dans la classe de cette extension.

Était-ce utile?

La solution

Il est pas vrai que convertView sera toujours une instance existante; vous devriez vérifier si elle est nulle et instancier il. Sinon, vous pouvez le changer comme vous l'avez fait.

Cela devrait être comme:

public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView == null)
        convertView = //inflate your row here
    View row = convertView;
    //Manipulate the row here
    return(row);
}

Autres conseils

je modifier la méthode de getView:

public View getView(int position, View convertView, ViewGroup parent) {
    convertView = View.inflate(getContext(), R.layout.myLayout, null);
    TextView text = (TextView) convertView.findViewById(R.id.listText);
    ImageView icon = (ImageView) convertView.findViewById(R.id.listIcon);

    // If there's an icon defined
    if (mIcon_id != 0) {
      icon.setImageResource(mIcon_id);
    }

    // If text color defined
    if (mTextColor != 0) {
      text.setTextColor(mTextColor);
    }

    // If background color set
    if (mBackgroundColor != 0) {
      convertView.setBackgroundColor(mBackgroundColor);
    }

    return convertView;
}

Je pense que vous obtenez NPE parce que vous essayez de créer un textview et un imageview dans une vue où ils ne sont pas là.

Si vous voulez gonfler un ListView avec des entrées d'une base de données, dans votre activité vous définissez main.xml cinque un ListView:

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/listView1">
</ListView>

et la méthode onCreate vous définissez la vue de ce xml avec setContentView(R.layout.main);. Ensuite, vous créez votre curseur sur votre base de données et votre adaptateur personnalisé:

    MySimpleCursorAdapter adapter = new MySimpleCursorAdapter(this, R.layout.entry,
                names, new String[] {Phones.NAME, Phones.NUMBER}, new int[] {
                R.id.listIcon, R.id.listText});
    startManagingCursor(cursor);
    ListView listView = (ListView) findViewById(R.id.listView1);
    listView.setAdapter(adapter);

et vous définissez un entry.xml avec votre listIcon et ListText, où les points d'adaptateur. Dans mon exemple, j'interroger les noms et les numéros de la liste de contacts.

Dans votre adaptateur personnalisé, vous devez accéder à votre textview et imageview à l'intérieur getView ou Bindview sans aucun problème.

que vous avez et par exemple pour obtenir tous les contacts dans votre liste de contacts avec son image, le nom et le numéro, mais en utilisant ListActivity au lieu de l'activité, et un seul xml avec deux vues de texte et un imageview. Si vous utilisez ListActivity vous n'avez pas besoin d'utiliser un ListView et vous n'avez pas besoin de définir l'affichage du contenu de l'activité.

J'espère que ça aide!

Ne pas oublier de mettre. Layout_width et layout_heigth pour chacun de vos vues

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top