2011-09-12 19 views
15

Mam kilka problemów z wyświetleniem mojego listview w prostej aplikacji, którą piszę. Z jakiegoś powodu metoda getView() mojej klasy adaptera nie jest wywoływana. Jednakże, gdy zostanie wywołana getCount() w mojej klasie adaptera, to nie zwróci ona 0, ale faktycznie zwraca poprawną wartość. Jestem bardzo zdezorientowany, dlaczego to nie działa.Listview nie jest zapełniany, getView() nie jest wywoływany

Oto mój aktywny:

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

Oto układ stosowany przez aktywność:

<?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> 

Wreszcie tutaj jest moja klasa adaptera:

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

Spróbuj wprowadzić metodę getViewTypeCount i zwróć ją 1; a następnie getItemViewType powinien zwrócić 0. –

+0

Dodałem je, ale nie było efektu ... – slayton

+0

Czy próbowałeś wdrożenia wszystkich metod adaptera? Jeśli jest coś zasadniczo nie tak z twoim kodem, nie widzę go. –

Odpowiedz

30

Spróbuj zmienić android:layout_height="fill_parent" zamiast tego tekstowy do wrap_content. Wierzę, że lista nie jest nigdy wyświetlana, więc nigdy nie ma potrzeby wywoływania getView()

+2

+1, mój widok był ukryty, więc 'getView()' nigdy nie było wywoływane – Cody

+3

Aw tak, rozwiązał mój problem (prawie 1 rok później) I love stackoverflow – acedanger

+0

cholernie dziękuję – mtb

4

Wiem, że istnieje już odpowiedź na to pytanie.

Mam jednak inną przyczynę i przyczynę z podobnym objawem co pierwotne pytanie (getView() nie jest wywoływana), dlatego uważam, że warto tutaj udokumentować inne osoby mające inną przyczynę.

Jak podaje http://hissain.in/wordpress/?p=659

„Czasami wydaje notifyDataSetChanged() nie będzie pracować dla Ciebie (i stąd getView() nie będzie się nazywa). Powodem może być utrata przez adapter odwołania do listy. Podczas pierwszej inicjalizacji adapter pobiera odwołanie do listy tablic i przekazuje jej nadklasę. Ale jeśli ponownie zainicjujesz istniejącą listę tablic, stracisz odniesienie, a zatem kanał komunikacji z adapterem "

Dlatego nigdy nie reinicjuj listy, ale zamiast tego użyj funkcji clear() na liście.

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