0

列表视图有一点问题。它工作正常,有一个例外:当我向下滚动到列表视图的底部时,我得到一个空指针异常。使用调试器,我已经验证了 arraylist 的加载顺序完全正确,并且日期标签在它们应该在的位置。但是,一旦我开始滚动到必须看到新项目的位置,就会出现错误。我不确定为什么会发生这种情况,并且仅当列表滚动到足以使某些元素弹出而其他元素需要进入视野时。

 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”处得到一个空指针异常。

我究竟做错了什么?提前致谢!

4

1 回答 1

0

无法准确说出您的代码在哪里失败。您引用了 Android 代码中的异常点。我们需要查看整个堆栈跟踪,特别是它在代码中的开始位置,以及代码中的相应行(您发布的代码片段没有行号)。

至少一个问题是您在getView(). 在when 不为null 的情况下,类型和item 的类型convertView之间没有联系。可能是您夸大的两个视图中的任何一个的回收版本。它不一定与项目的类型相匹配。convertViewconvertView

然后,您尝试在 中查找特定视图convertView,这些视图可能存在也可能不存在。瞧,NPE。

如果您要混合这样的视图,则每次都必须添加一个新视图;你不能使用convertView.

如果你想使用convertView,并且在一个列表中确实有不同类型的东西,你需要创建一个 uber-view 来合并每种类型的视图。然后根据项目的类型使一个部分或另一个部分可见,并隐藏另一部分。

于 2012-07-06T00:39:08.167 回答