如何在ListView中单击null项?

时间:2014-03-19 14:26:16

标签: android android-listview nullpointerexception android-2.3-gingerbread

我在一些用户的Crashlytics中遇到了奇怪的NullPointerException。

我有适配器,它是从BaseAdapter实现的:

abstract public class BaseListAdapter<T> extends BaseAdapter {
    private final ArrayList<T> items = new ArrayList<T>();

    ....

    @Override
    public T getItem(int position) {
        return items.get(position);
    }

    ....
}

具体课程:

class MessagesAdapter extends BaseListAdapter<MessagesListItem> {

    ....

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        if (view == null)
            view = View.inflate(getContext(), R.layout.message_listitem, null);

        MessagesListItem item = getItem(position);

        NetworkImageView avatar = (NetworkImageView) view.findViewById(R.id.message_listitem_avatar);
        ImageView online = (ImageView) view.findViewById(R.id.message_listitem_online);
        TextView nick = (TextView) view.findViewById(R.id.message_listitem_nick);
        TextView preview = (TextView) view.findViewById(R.id.message_listitem_preview);
        TextView unread = (TextView) view.findViewById(R.id.message_listitem_unread);

        avatar.setImageUrl(item.userAvatar, MyApp.getInstance().getImageLoader());
        online.setVisibility(item.userOnline? View.VISIBLE : View.GONE);
        nick.setText(String.format("%s, %d", item.userNick, item.userAge));
        preview.setText(item.preview);
        unread.setText(String.valueOf(item.unread));
        unread.setVisibility(item.unread == 0? View.GONE : View.VISIBLE);

        return view;
    }

    ....
}

如果你看到我将null放入此适配器中我在getView(...)方法中使用NullPointerException。但我不

我有ListView与附加的实例形式这个具体的类。我已经实现了OnItemClickListener:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Adapter adapter = parent.getAdapter();
    MessagesListItem messagesListItem = (MessagesListItem) adapter.getItem(position);
    User user = messagesListItem.getUser(); //<-- I got NullPointerException here

    ....
}

怎么会发生这种情况?这个适配器被包装到HeaderViewListAdapter中,但我没有得到任何类转换异常。另外我在getView()中没有得到空指针。就这个方法而言。

我知道,这个问题只发生在Android 2中。我尝试了一切,并没有重现这一点,胸围用户仍然有。

我想念的是什么?有谁知道怎么修复?或者如何确定/重现这个问题?

1 个答案:

答案 0 :(得分:2)

通过在列表视图中引入页眉或页脚,您可以更改对象的位置。

也就是说,如果您有1个标题视图,adapter.getItem(0)将返回您在listView.addHeaderView(view, object, isSelectable)中使用的对象。如果您仅使用listView.addHeader(view),则object为null且isSelectable为true。

您可以将onItemClick侦听器中的位置与已知的页眉/页脚位置进行比较,也可以调用listView.addHeaderView(view, null, false),这也将禁用选择&amp;触摸标题视图的状态。

适配器中的位置没有影响(0仍然是列表中的第一项)因为包装适配器调整位置:line~175 @ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/HeaderViewListAdapter.java