2011-09-12 11 views
15

Sto riscontrando alcuni problemi per visualizzare la mia listview in una semplice applicazione che sto scrivendo. Per qualche motivo il metodo getView() della mia classe dell'adattatore non viene chiamato. Tuttavia, quando viene chiamato getCount() nella mia classe dell'adattatore, non restituisce 0 ma restituisce effettivamente il valore corretto. Sono davvero confuso sul motivo per cui questo non funziona.Visualizzazione elenco non popolata, getView() non viene chiamato

Qui è la mia attività:

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ListView; 

public class CardListActivity extends Activity { 


protected ListView lv; 
protected int nCards = 12; 

protected String[] cardList = new String[nCards]; 

public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.cardlist); 

    this.loadCardStrings(); 

    lv = (ListView) findViewById(R.id.CardList_ListView); 
    EditorListAdapter adapter = new EditorListAdapter(this, this.cardList); 
    lv.setAdapter(adapter); 
} 

protected void loadCardStrings(){ 
    cardList = getResources().getStringArray(R.array.card_list); 

    Util.logD("Created the string arrays with:" + Integer.toString(cardList.length) + " items."); 
} 
public void onStart(){ 
    super.onStart(); 
} 
public void onResume(){ 
    super.onResume(); 
} 
public void onPause(){ 
    super.onPause(); 
} 
public void onStop(){ 
    super.onStop(); 

} 
public void onDestroy(){ 
    super.onDestroy(); 
} 
} 

Ecco il layout utilizzato per l'attività:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout android:id="@+id/CardList_LinearLayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <TextView android:id="@+id/text" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:text="Hello"/> 
    <ListView android:id="@+id/CardList_ListView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</LinearLayout> 

Infine ecco la mia classe di adattatori:

import android.app.Activity; 
import android.graphics.Color; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 

public class EditorListAdapter extends BaseAdapter 
{ 
    Activity context; 
    String names[]; 

    public EditorListAdapter(Activity context, String[] title) { 
     super(); 
     this.context = context; 
     this.names = title; 
    } 

    public int getCount() { 
     Util.logD("EditorListAdapter.getCount() ret:" + Integer.toString(names.length)); 
     return names.length; 
    } 

    public Object getItem(int position) { 
     Util.logD("EditorListAdapter.getItem()"); 
     return null; 
    } 

    public long getItemId(int position) { 
     Util.logD("EditorListAdapter.getItemId()"); 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     TextView t; 
     if (convertView == null) 
      t = new TextView(parent.getContext()); 
     else 
      t = (TextView) convertView; 

     t.setText(this.names[position]); 

     convertView = t; 

     Util.logD("EditorListAdapter.getView() + " + t.getText().toString()); 

     return convertView; 
    } 

    // Added per K-Ballo suggestion 
    public int getViewTypeCount(){ 
    return 1; 
} 
public int getItemViewType(){ 
    return 0; 
} 
} 
+0

Provare a implementare getViewTypeCount e renderlo restituito 1; e quindi getItemViewType dovrebbe restituire 0. –

+0

Li ho aggiunti ma non c'era alcun effetto ... – slayton

+0

Hai provato a implementare tutti i metodi dell'adapter? Se c'è qualcosa di fondamentalmente sbagliato nel tuo codice, non riesco a vederlo. –

risposta

30

Provare a cambiare il android:layout_height="fill_parent" per la visualizzazione di testo a wrap_content invece. Credo che la listview non venga mai visualizzata, quindi non c'è mai bisogno di chiamare getView()

+2

+1, la mia vista era nascosta in modo che 'getView()' non è mai stato chiamato. – Cody

+3

Aw sì, risolto il mio problema (quasi 1 anno dopo) Adoro lo StackOverflow – acedanger

+0

dannazione Grazie – mtb

4

So che c'è già una risposta a questa domanda.

Tuttavia, sto avendo una causa e una ragione di origine diversa con un sintomo simile alla domanda originale (non viene chiamato getView()), quindi penso che sia utile documentare qui per altre persone che hanno cause di root differenti.

Come dato da http://hissain.in/wordpress/?p=659

“A volte sembra notifyDataSetChanged() non funziona per voi (e quindi GetView() non verrà chiamato). Il motivo potrebbe essere il tuo adattatore perde il riferimento al tuo elenco. Quando si inizializza per la prima volta l'adattatore, prende un riferimento dell'elenco di array e passa alla sua superclasse. Ma se si reinizializza l'elenco di array esistente, perde il riferimento, quindi il canale di comunicazione con Adapter "

Quindi non reinizializzare mai l'elenco, ma utilizzare clear() nell'elenco.

list.clear(); // Right Thing to Do 
list = new List<T>(); // Wrong Thing to Do, will lose reference in the adapter 
Problemi correlati