列表视图中的NullPointer异常,为列表项创建单独的布局?

时间:2015-07-10 09:11:09

标签: java android listview android-listview android-custom-view

我创建了一个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,

2 个答案:

答案 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_ITEM1TYPE_ITEM2选择的值也可能不太好。请考虑改为使用01

答案 1 :(得分:1)

可能是你的getItemViewType。您应该返回从零开始的索引(即0或1而不是1或0)。来自docs

  

注意:整数必须在0到getViewTypeCount() - 1

的范围内