1

由于某些原因,我的自定义 ArrayAdapter 的 getView 没有被调用,并且 android 显示一个空列表。我已经在我的数据源类中插入了 cursor.getCount() 以确保我的查询不为空。

活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(TAG, "onCreate called");

    setContentView(R.layout.conference_list_layout);

    Log.d(TAG, "create ConferenceDataSource");
    datasource = new ConferenceDataSource(this);

    Log.d(TAG, "open ConferenceDataSource");
    datasource.open();

    Log.d(TAG, "getAllUpcomingConferences");
    List<Conference> conferences = datasource.getAllUpcomingConferences();

    Log.d(TAG, "set ConferenceArrayAdapter");
    setListAdapter(new ConferenceArrayAdapter(this, conferences));
}

数据源:

public List<Conference> getAllUpcomingConferences() {
    Log.d(TAG, "getAllUpcomingConferences called");

    List<Conference> conferences = new ArrayList<Conference>();

    Cursor cursor = database.query(
            DatabaseConstants.TABLE_CONFERENCES, 
            fields, 
            DatabaseConstants.CONFERENCE_START + ">" + (Calendar.getInstance()).getTimeInMillis(), 
            null, 
            null, 
            null, 
            null);

    cursor.moveToFirst();

    while(!cursor.isAfterLast()) {
        Conference conference = cursorToConference(cursor);
        conferences.add(conference);
        cursor.moveToNext();
    }

    cursor.close();

    return conferences;
}

private Conference cursorToConference(Cursor cursor) {
    Log.d(TAG, "cursorToConference called");

    Conference conference = new Conference();

    conference.setId(
            cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCE_ID)));

    conference.setStart(
            cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCE_START)));

    conference.setEnd(
            cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCE_END)));

    conference.setTopic(
            cursor.getString(cursor.getColumnIndex(DatabaseConstants.CONFERENCE_TOPIC)));

    conference.setCreator(
            cursor.getLong(cursor.getColumnIndex(DatabaseConstants.CONFERENCE_CREATOR)));

    return conference;
}

阵列适配器:

public ConferenceArrayAdapter(Context context, List<Conference> conferences) {
    super(context, R.layout.conference_list_item);
    Log.d(TAG, "constructor called");
    this.context = context;
    this.conferences = conferences;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.d(TAG, "getView called");

    LayoutInflater inflator = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View view = inflator.inflate(R.layout.conference_list_item, parent, false);

    Date conferenceDate = new Date(conferences.get(position).getStart());

    TextView dayOfWeek = (TextView) view.findViewById(R.id.conference_list_dayofweek);

    dayOfWeek.setText(new SimpleDateFormat("E").format(conferenceDate));

    TextView date = (TextView) view.findViewById(R.id.conference_list_date);

    date.setText(new SimpleDateFormat("dd.MM.yyyy").format(conferenceDate));

    TextView time = (TextView) view.findViewById(R.id.conference_list_time);

    time.setText(new SimpleDateFormat("HH:mm").format(new Date(conferences.get(position).getStart())) + 
            new SimpleDateFormat("HH:mm").format(new Date(conferences.get(position).getEnd())));

    return view;
}

会议列表布局.xml

<include layout="@layout/actionbar_layout" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:orientation="vertical">

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

会议列表项目.xml

<TextView
    android:id="@+id/conference_list_dayofweek"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true" />

<TextView
    android:id="@+id/conference_list_date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/conference_list_dayofweek" />

<TextView
    android:id="@+id/conference_list_time"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@id/conference_list_date" />

可能是错误在xml文件中。我正在使用几个自定义的 ArrayAdapter,它们都可以正常工作并且看起来几乎相同。我读过一些关于使用 match_parent 而不是 wrap_content 的内容,但没有成功。

4

2 回答 2

8

在您的自定义适配器(您可能正在扩展ArrayAdapter)中实现该getCount方法并返回Conferences大小列表:

public int getCount() {
   return conferences.size();
}
于 2012-04-21T20:46:40.560 回答
0

您需要extends ArrayAdapter为您的数组适配器类 - 否则它不知道要调用的方法

于 2012-04-21T20:46:29.587 回答