当新项目滚动到视图中时,带有自定义适配器的Android-listview失败

当新项目滚动到视图中时,带有自定义适配器的Android-listview失败,android,Android,listview有点小问题。它可以正常工作,但有一个例外:当我向下滚动到listview的底部时,会得到一个nullpointerexception。使用调试器,我验证了arraylist的加载顺序是否正确,日期标签是否正确。然而,一旦我开始滚动到一个新项目必须进入视图的地方,我就会得到错误。我不知道为什么会发生这种情况,只有当列表滚动到一定程度,一些元素弹出,其他元素需要进入视图时才会发生这种情况 public class MyCustomBaseAdapter extends BaseAd

listview有点小问题。它可以正常工作,但有一个例外:当我向下滚动到listview的底部时,会得到一个nullpointerexception。使用调试器,我验证了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;

 }
}
我在ViewRoot.deliverKeyEventToViewHierarchy的第2414行得到一个nullpointerexception


我做错了什么?提前谢谢

不可能准确地说出代码失败的地方。您引用了Android代码中的异常点。我们需要查看整个堆栈跟踪,特别是它在代码中的起始位置,以及代码中相应的行—您发布的代码片段并没有行号

至少有一个问题是在getView的实现中混合了视图。在convertView不为null的情况下,convertView的类型和item的类型之间没有连接。convertView可以是您膨胀的两个视图中任意一个的循环版本。它不一定与项目的类型匹配

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

如果你正在做这样的混合视图,你必须每次膨胀一个新的;您不能使用convertView

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