Java listview中的NullPointer异常,是否为listitems创建单独的布局?

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

我创建了一个listview,它包含文本或图像两种类型的项目。但只有在向下滚动时,才会出现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;


}}
公共类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);
}