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