2012-07-06 44 views
0

遇到輕微的ListView問題。它可以正常工作,但有一個例外:當我向下滾動ListView的底部時,我得到一個nullpointerexception。使用調試器,我已經驗證了arraylist按照正確的順序加載,並且日期標籤正確的位置。但是,一旦我開始滾動到新項目必須進入視圖的位置,我會看到錯誤。我不確定爲什麼會發生這種情況,並且只有在列表滾動到足以使某些元素彈出而其他元素需要顯示時纔會發生。Android - 帶有自定義適配器的列表視圖在新項滾動查看時失敗

public class MyCustomBaseAdapter extends BaseAdapter { 
private static ArrayList<Object> searchArrayList; 

private LayoutInflater mInflater; 

public MyCustomBaseAdapter(Context context, ArrayList<Object> results) { 

    searchArrayList = results; 
    mInflater = LayoutInflater.from(context); 
} 

public int getCount() { 
    return searchArrayList.size(); 
} 

public Object getItem(int position) { 
    return searchArrayList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public int getItemViewType(int position) { 
    Object item = getItem(position); 

    if(item instanceof Appointment) { 
     return 0; 
    } else { 
     // It's a section title: 
     return 1; 
    } 
} 

public View getView(int position, View convertView, ViewGroup parent) 
{ 
    Object item = getItem(position); 

    if(convertView == null) 
    { 
     // Create item view for first time 
     if(item instanceof Appointment) 
     { // inflate appointment list view item layout 
      convertView = mInflater.inflate(R.layout.calendar_item, null); 
     } 
     else 
     { // inflate title section list view item layout 
      convertView = mInflater.inflate(R.layout.calendar_item_header, null); 
     } 
    } 

    // Update list view item view according to type: 
    if(item instanceof Appointment) 
    { 
     Appointment a = (Appointment) item; 

     ViewHolder holder; 

     holder = new ViewHolder(); 
     holder.txtAttendee = (TextView) convertView.findViewById(R.id.attendee); 
     holder.txtSummary = (TextView) convertView.findViewById(R.id.summary); 
     holder.txtStarts = (TextView) convertView.findViewById(R.id.starts); 
     holder.txtEnds = (TextView) convertView.findViewById(R.id.ends); 
     holder.txtCategories = (TextView) convertView.findViewById(R.id.categories); 

     convertView.setTag(holder); 
     convertView.setPadding(4, 4, 4, 16); 

     holder.txtAttendee.setText(a.GetAttendee()); // exception here 
     holder.txtSummary.setText(">" + a.GetSummary()); 
     String st = a.GetDTStart().toString(); 
     String en = a.GetDTEnd().toString(); 

     holder.txtStarts.setText(st.substring(0,16)); 
     holder.txtEnds.setText(en.substring(0,16)); 

     String cat = a.GetCategories(); 
     holder.txtCategories.setText(cat); 

    } 
    else if(item instanceof String) 
    { 
     // Item is a section header string: 
     String label = (String) item; 
     // Retrieve label TextView from convertView... etc... 
     HeaderHolder holder; 

     holder = new HeaderHolder(); 

     holder.txtHeader = (TextView) convertView.findViewById(R.id.header); 

     convertView.setTag(holder); 
     convertView.setPadding(2,2,2,2); 
     convertView.setClickable(false); 
     convertView.setFocusable(false); 

     holder.txtHeader.setText(" " + label); 
    } 

    return convertView; 
} 

static class ViewHolder 
{ 
    TextView txtAttendee; 
    TextView txtSummary; 
    TextView txtStarts; 
    TextView txtEnds; 
    TextView txtCategories; 
} 

static class HeaderHolder 
{ 
    TextView txtHeader; 

} 
} 

我得到線2414

我在做什麼錯在 「ViewRoot.deliverKeyEventToViewHierarchy」 一個NullPointerException?提前致謝!

回答

0

無法準確地判斷代碼的失敗位置。你引用了Android代碼中的異常點。我們需要查看整個堆棧跟蹤,尤其是它在代碼中的起始位置,以及代碼中的相應行(您發佈的代碼片段沒有行號)。

至少有一個問題是,您在getView()的實施中混合了視圖。在convertView不爲空的情況下,convertView的類型與項目類型之間沒有關聯。 convertView可能是您膨脹的兩個視圖中的任意一個的再生版本。它不一定會匹配項目的類型。

然後您嘗試找到convertView中的特定視圖,該視圖可能存在也可能不存在。瞧,NPE。

如果你正在做這樣的混合視圖,你必須每次膨脹一個新的;您不能使用convertView

如果您想使用convertView,並且您確實在單個列表中有不同類型的東西,則需要創建一個超級視圖,即合併每種類型的視圖。然後根據物品的類型製作一個部分或其他部分,然後隱藏其他部分。

相關問題