Domanda

Sto avendo alcuni problemi a far apparire la mia visione di List in una semplice applicazione che sto scrivendo. Per qualche motivo il getView() Il metodo della mia classe di adattatore non viene chiamato. Tuttavia, quando quando getCount() è chiamato nella mia classe di adattatore non sta restituendo 0 ma in realtà sta restituendo il valore corretto. Sono davvero confuso sul perché questo non funziona.

Ecco 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 dall'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>

Finalmente ecco la mia classe di adattatore:

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;
}
}
È stato utile?

Soluzione

Prova a cambiare il android:layout_height="fill_parent" per TextView a wrap_content invece. Credo che ListView non venga mai visualizzato, quindi non è mai necessario chiamare getView ()

Altri suggerimenti

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

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

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

“A volte sembra che notifyDataSEtchanged () non funzionerà per te (e quindi getView () non verrà chiamato). Il motivo potrebbe essere il tuo adattatore perde riferimento alla tua lista. Quando inizializza prima l'adattatore, prende un riferimento della tua lista di array e passa alla sua superclasse. Ma se reinizializza l'elenco degli array esistente perde il riferimento, quindi il canale di comunicazione con adattatore "

Quindi non reinitializzare mai l'elenco, ma usa invece Clear () nell'elenco.

list.clear(); // Right Thing to Do
list = new List<T>(); // Wrong Thing to Do, will lose reference in the adapter
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top