ListView не заполняется, getView () не вызывается - PullRequest
15 голосов
/ 12 сентября 2011

У меня возникли некоторые проблемы с отображением списка в простом приложении, которое я пишу. По какой-то причине метод getView() моего класса адаптера не вызывается. Однако, когда getCount() вызывается в моем классе адаптера, он не возвращает 0, а фактически возвращает правильное значение. Я действительно не понимаю, почему это не работает.

Вот моя активность:

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

Вот макет, используемый действием:

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

Наконец, вот мой класс адаптера:

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

Ответы [ 2 ]

30 голосов
/ 12 сентября 2011

Попробуйте вместо этого изменить android:layout_height="fill_parent" для текстового обзора на wrap_content.Я считаю, что просмотр списка никогда не отображается, поэтому нет необходимости вызывать getView ()

4 голосов
/ 09 апреля 2014

Я знаю, что на этот вопрос уже есть ответ.

Однако у меня другая основная причина и причина с симптомом, аналогичным исходному вопросу (getView () не вызывается), поэтому я думаю, что здесь полезно документировать других людей, имеющих другую основную причину.

Как указано http://hissain.in/wordpress/?p=659

«Иногда кажется, что notifyDataSetChanged () не будет работать для вас (и, следовательно, getView () не будет вызываться). Причиной может быть то, что ваш адаптер теряет ссылку на ваш список . Когда вы впервые инициализируете Adapter, он берет ссылку на ваш список массивов и передает ее суперклассу. Но если вы повторно инициализируете свой существующий список массивов, он теряет ссылку и, следовательно, канал связи с адаптером »

Следовательно, никогда не инициализируйте ваш список заново, вместо этого используйте clear () в списке.

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