我创建了一个listview,它包含两种类型的项目text或image.But我只在向下滚动时获得nullpointer异常。 我的适配器的代码就是这个。
public class ListViewAdapter extends BaseAdapter {
ArrayList<ListModel> myList = new ArrayList<ListModel>();
LayoutInflater inflater;
Context context;
private static final int TYPE_ITEM1 = 1;
private static final int TYPE_ITEM2 = 2;
public ListViewAdapter(Context context, ArrayList<ListModel> myList) {
this.myList = myList;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
int type;
@Override
public int getItemViewType(int position) {
ListModel listModel = myList.get(position);
String data = listModel.getType();
/* if (data.equals("Text")) {
return type1;
} else if (data.equals("Image")) {
return type2;
}return 0;*/
if (data.equals("Text")) {
type = TYPE_ITEM1;
} else if (data.equals("Image")) {
type = TYPE_ITEM2;
}
return type;
}
@Override
public int getViewTypeCount() {
return myList.size() + 1;
}
@Override
public int getCount() {
return myList.size();
}
@Override
public ListModel getItem(int position) {
// return myList.get(position);
if (position >= myList.size()) {
return null;
}
return myList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
View v = convertView;
TextView textView = null;
ImageView imageView = null;
int type = getItemViewType(position);
System.out.println("getView " + position + " " + v + " type = " + type);
if (v == null) {
holder = new ViewHolder();
if (type == TYPE_ITEM1) {
v = inflater.inflate(R.layout.list_text, null);
textView = (TextView) v.findViewById(R.id.text);
} else if (type == TYPE_ITEM2) {
v = inflater.inflate(R.layout.list_image, null);
imageView = (ImageView) v.findViewById(R.id.imgView);
}
holder.textView = textView;
holder.imageView = imageView;
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
ListModel model = myList.get(position);
String datatype = model.getType();
if (datatype.equals("Text")) {
holder.textView.setText(model.getData());
} else if (datatype.equals("Image")) {
UrlImageViewHelper.setUrlDrawable(holder.imageView, model.getData());
}
return v;
}
public static class ViewHolder {
public TextView textView;
public ImageView imageView;
}}
错误是
第117行java.lang.NullPointerException
,它是textView,
答案 0 :(得分:2)
这是一个经典ArrayIndexOutOfBoundsException
。别忘了java中的数组(就像大多数编程语言一样)是0索引的,意味着第一个元素是索引0
(不是1
)。
您还没有显示任何来电代码,但很可能您的部分代码正在调用方法getItem()
或getView()
,其值为2
的位置应该是1
(访问列表中的第二个元素)。
如果你无法控制来电者(也许是来自第三方图书馆),那么我建议:
position
的值偏移-1。但这可能会破坏代码的其他部分。public ListModel getItem(int position) { if (position >= myList.size()) { // TODO: log an error, show a message, etc. return null; // or a default value } return myList.get(position); }
如果它们必须代表数组中的索引,那么您为TYPE_ITEM1
和TYPE_ITEM2
选择的值也可能不太好。请考虑改为使用0
和1
。
答案 1 :(得分:1)
可能是你的getItemViewType
。您应该返回从零开始的索引(即0或1而不是1或0)。来自docs:
注意:整数必须在0到getViewTypeCount() - 1
的范围内