Domanda

Stavo usando SimpleCursorAdapter con un file XML con alcuni punti di vista definiti in esso:

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

Il mio obiettivo era quello di impostare il colore del testo del TextView, e il colore di sfondo del LinearLayout (che è, ogni riga della ListView) di programmazione; il colore viene restituito da un database.

mi è stato sempre NPE quando si cerca di manipolare il TextView per esempio, dopo che aveva trovato con nessuna lamentela:

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

Il che è giusto; se c'è più voci nella lista, è ragionevole supporre che " R.id.listText " non funzionerà. Così ho esteso SimpleCursor Adapter:

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);
}

E ho due errori diversi:

  • Un NPE simile è lanciato " text.setTextColor (mTextColor) "
  • Se le linee con l'ImageView sono senza commenti, ho un " ClassCastException: android.widget.TextView " dove mi trovo chiamata " row.findViewById (R.id.listIcon) "

Per riferimento, stavo cercando di utilizzare il codice di esempio di Commonsware, applicandolo alla mia situazione. collegamento (pdf)


Cambiato in questo:

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);
}

Ora ho un ClassCastException nell'attività successiva (sulla voce nell'elenco clicca). Nulla è stato modificato nella prossima attività; ha funzionato quando si utilizza un SimpleListAdapter per la lista che aveva le voci (su cui, facendo clic porterebbe a Activity2), quindi penso che sia ancora qualcosa che sto facendo male in questa classe estesa.

È stato utile?

Soluzione

Non è vero che convertView sarà sempre un'istanza esistente; si dovrebbe verificare se è nullo e quindi un'istanza. In caso contrario, si può cambiare come avete fatto.

Questo dovrebbe essere come:

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);
}

Altri suggerimenti

Vorrei modificare il metodo 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;
}

Credo che state ottenendo NPE perché si sta cercando di creare un TextView ed un ImageView in una vista in cui non ci sono.

Quando si vuole gonfiare un ListView con le voci provenienti da un database, nella vostra attività si definisce main.xml whith 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>

e nel metodo onCreate si imposta la vista a questo xml con setContentView(R.layout.main);. Quindi si crea il cursore al database e il vostro adattatore personalizzato:

    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);

e si definisce un entry.xml con il vostro listIcon e listText, dove i punti di adattamento. Nel mio esempio, sto interrogando i nomi ei numeri dalla lista dei contatti.

Nella scheda personalizzata, si deve accedere al vostro TextView e imageview all'interno GetView o Bindview senza alcun problema.

qui avete ed esempio per ottenere tutti i contatti nell'elenco contatti con la sua immagine, il nome e il numero, ma utilizzando ListActivity invece di attività, e solo un xml con due punti di vista di testo e un ImageView. Se si utilizza ListActivity non è necessario utilizzare un ListView e non è necessario per impostare la visualizzazione di contenuti nell'attività.

Spero che aiuta!

Non dimenticare di mettere:. Layout_width e layout_heigth per ognuno dei vostri punti di vista

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top