2012-04-21 97 views
1

由於某些原因,我的自定義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的一些信息,但它沒有解決。

回答

8

在您的自定義適配器(你可能延長ArrayAdapter)實施getCount方法並返回Conferences大小的列表:

public int getCount() { 
    return conferences.size(); 
} 
+0

非常感謝這真的解決了...... omg。爲什麼它在不重寫getCount函數的情況下與其他ArrayAdapter一起工作? – 2012-04-21 20:52:27

+0

@ sebbl.sche在其他適配器中,您可能會使用父類'ArrayAdapter'中的其他超級構造函數(也包含表示數據的對象的列表/數組,從該列表中,適配器知道在getCount中要做什麼方法)。在你的適配器中,你使用了只帶有'Context'和一個資源ID的構造函數,所以這個適配器沒有任何數據集(所以'getCount'方法返回0,適配器是空的,getView isn' t叫)。檢查「ArrayAdapter」類的文檔並檢查其他構造函數。 – Luksprog 2012-04-21 20:58:21

0

您需要extends ArrayAdapter爲您的陣列適配器類 - 否則它不知道該方法被調用

+0

我擴展了它。我的班級定義看起來像這樣。公共類ConferenceArrayAdapter擴展ArrayAdapter 2012-04-21 20:48:09