Java listview中的NullPointer异常,是否为listitems创建单独的布局?
我创建了一个listview,它包含文本或图像两种类型的项目。但只有在向下滚动时,才会出现nullpointer异常。 我的适配器代码如下Java listview中的NullPointer异常,是否为listitems创建单独的布局?,java,android,listview,android-listview,android-custom-view,Java,Android,Listview,Android Listview,Android Custom View,我创建了一个listview,它包含文本或图像两种类型的项目。但只有在向下滚动时,才会出现nullpointer异常。 我的适配器代码如下 public class ListViewAdapter extends BaseAdapter { ArrayList<ListModel> myList = new ArrayList<ListModel>(); LayoutInflater inflater; Context context; private static f
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;
}}
公共类ListViewAdapter扩展了BaseAdapter{
ArrayList myList=新的ArrayList();
充气机;
语境;
私有静态final int TYPE_ITEM1=1;
私有静态最终int类型_ITEM2=2;
公共ListViewAdapter(上下文,ArrayList myList){
this.myList=myList;
this.context=上下文;
充气器=从(此上下文)开始的充气器;
}
int型;
@凌驾
public int getItemViewType(int位置){
ListModel ListModel=myList.get(位置);
字符串数据=listModel.getType();
/*if(data.equals(“文本”)){
返回类型1;
}else if(data.equals(“Image”)){
返回类型2;
}返回0*/
if(data.equals(“文本”)){
类型=类型\项目1;
}else if(data.equals(“Image”)){
类型=类型_项2;
}
返回类型;
}
@凌驾
public int getViewTypeCount(){
返回myList.size()+1;
}
@凌驾
public int getCount(){
返回myList.size();
}
@凌驾
公共列表模型getItem(int位置){
//返回myList.get(位置);
如果(位置>=myList.size()){
返回null;
}
返回myList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
视图v=转换视图;
TextView TextView=null;
ImageView ImageView=null;
int type=getItemViewType(位置);
系统输出打印项次(“getView”+位置+“”+v+”类型=“+类型);
如果(v==null){
holder=新的ViewHolder();
if(type==type_ITEM1){
v=充气机充气(R.layout.list_文本,空);
textView=(textView)v.findViewById(R.id.text);
}else if(type==type_ITEM2){
v=充气机充气(R.layout.list_图像,空);
imageView=(imageView)v.findViewById(R.id.imgView);
}
holder.textView=textView;
holder.imageView=imageView;
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
ListModel model=myList.get(位置);
字符串数据类型=model.getType();
if(datatype.equals(“文本”)){
holder.textView.setText(model.getData());
}else if(datatype.equals(“Image”)){
UrlImageViewHelper.setUrlDrawable(holder.imageView,model.getData());
}
返回v;
}
公共静态类视图持有者{
公共文本视图文本视图;
公共影像视图;
}}
错误是
java.lang.NullPointerException
在第117行,它是文本视图,它是一个经典的ArrayIndexOutOfBoundsException
。不要忘记java中的数组(像大多数编程语言一样)是0索引的,这意味着第一个元素位于索引0
(而不是1
)
您没有显示任何调用方代码,但很可能您的一些代码正在调用方法getItem()
或getView()
,其位置值应为2
(访问列表中的第二个元素)
如果您无法控制调用方(可能来自第三方库),那么我建议:
- 将
位置的值偏移-1。但这可能会破坏代码的其他部分
- 在代码中添加一些保护以防止异常,例如:
如果必须表示数组中的索引,则为
TYPE_ITEM1
和TYPE_ITEM2
选择的值也可能不正确。考虑使用<代码> 0 和<代码> 1 <代码>。 < P>这可能是您的<代码> GETITEM VIEWTYPE 。您应该返回一个从零开始的索引(即0或1,而不是1或0)。从:
注意:整数必须在0到getViewTypeCount()的范围内-1
请添加与代码段中使用的编程语言对应的标记。请参阅我已经添加的标记@KryptosYou没有,因为语言是“Java”。Android是一个平台而不是一种语言。无论如何,我是为你做的。
getItemViewType
返回零基索引。这是0或1,而不是1或2。您刚刚更改了整个问题,使以前的注释和答案过时。这不是我们要走的路。Stackoverflow不是调试解决方案。当你有其他问题时,创建另一个帖子,或者至少保留上一个帖子,然后在下面添加一些文本。我解决了OutOfBoundException
问题,但现在我在holder.textView.setText(model.getData())中得到了NPE
仅当我滚动时。@devendra关于具体的什么?@Kryptos像您一样没有显示任何调用方代码,但很可能您的一些代码正在调用方法getItem()或getView(),其位置值为2,它应该是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);
}