【问题标题】:NullPointer Exception in listview,creating separate layout for listitems?列表视图中的 NullPointer 异常,为列表项创建单独的布局?
【发布时间】:2015-07-10 09:11:09
【问题描述】:

我创建了一个列表视图,其中包含两种类型的项目,文本或图像。但只有在我向下滚动时才会出现空指针异常。 我的适配器的代码是这样的。

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;


}}

错误是 java.lang.NullPointerException第117行,就是textView,

【问题讨论】:

  • 请添加与您的代码sn-p中使用的编程语言相对应的标签。
  • 请看我已经添加了。 @Kryptos
  • 你没有,因为语言是“Java”。 Android 是一个平台,而不是一种语言。反正我是为你做的。
  • getItemViewType 返回从零开始的索引。那是 0 或 1,而不是 1 或 2。
  • 您刚刚更改了整个问题,使之前的评论和答案过时了。这不是要走的路。 Stackoverflow 不是调试解决方案。当您有其他问题时,请创建另一个帖子或至少保留上一个帖子并在其下方添加一些文字。

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


【解决方案1】:

这是经典的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

【讨论】:

  • 我解决了OutOfBoundException,但现在我只有在滚动时才会在holder.textView.setText(model.getData()); 中得到NPE
  • @devendra 具体是什么?
  • @Kryptos like 你没有显示任何调用者代码,但很可能你的一些代码正在调用方法 getItem() 或 getView() ,其值为 2 的位置为 1(访问列表中的第二个元素)。 这意味着什么?
【解决方案2】:

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

注意:整数必须在 0 到 getViewTypeCount() - 1 的范围内

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多