列表视图有点问题。它工作正常,但有一个例外:当我向下滚过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行。
我做错了什么?提前谢谢!
答案 0 :(得分:0)
无法准确判断代码失败的位置。你引用了Android代码中的异常点。我们需要查看整个堆栈跟踪,特别是它在代码中的起始位置以及代码中的相应行(您发布的代码片段没有行号)。
至少有一个问题是您在getView()
的实施中混合了观点。在convertView
不为空的情况下,convertView
的类型与项目类型之间没有任何关联。 convertView
可能是您膨胀的两种观点之一的回收版本。它不一定与项目的类型相匹配。
然后尝试在convertView
中查找可能存在或不存在的特定视图。瞧,NPE。
如果您要混合这样的视图,则必须每次都要换新的视图;你不能使用convertView
。
如果你想使用convertView
,并且你在一个列表中确实有不同类型的东西,你需要创建一个超级视图,它是每种类型的视图的合并。然后根据项目的类型制作一个部分或另一个部分,并隐藏另一部分。