由於某些原因,我的自定義ArrayAdapter的getView沒有被調用,android會顯示一個空列表。我已經在我的數據源類中插入了cursor.getCount()以確保我的查詢不是空的。getView的自定義ArrayAdapter不叫
活動:
@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;
}
ArrayAdapter:
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;
}
conference_list_layout.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>
conference_list_item.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的一些信息,但它沒有解決。
非常感謝這真的解決了...... omg。爲什麼它在不重寫getCount函數的情況下與其他ArrayAdapter一起工作? – 2012-04-21 20:52:27
@ sebbl.sche在其他適配器中,您可能會使用父類'ArrayAdapter'中的其他超級構造函數(也包含表示數據的對象的列表/數組,從該列表中,適配器知道在getCount中要做什麼方法)。在你的適配器中,你使用了只帶有'Context'和一個資源ID的構造函數,所以這個適配器沒有任何數據集(所以'getCount'方法返回0,適配器是空的,getView isn' t叫)。檢查「ArrayAdapter」類的文檔並檢查其他構造函數。 – Luksprog 2012-04-21 20:58:21