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

时间:2012-07-06 00:26:42

标签: android

列表视图有点问题。它工作正常,但有一个例外:当我向下滚过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;

 }
}

我在&#34; ViewRoot.deliverKeyEventToViewHierarchy&#34;中获得了nullpointerexception。在第2414行。

我做错了什么?提前谢谢!

1 个答案:

答案 0 :(得分:0)

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

至少有一个问题是您在getView()的实施中混合了观点。在convertView不为空的情况下,convertView的类型与项目类型之间没有任何关联。 convertView可能是您膨胀的两种观点之一的回收版本。它不一定与项目的类型相匹配。

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

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

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