Question

I got strange NullPointerException in Crashlytics from some users.

I have Adapter, which is implemented from 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);
    }

    ....
}

And concrete class:

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;
    }

    ....
}

As you see if I put null into this adapter I for NullPointerException in getView(...) method. But I don't

I have ListView with attached instanced form this concrete class. And I have implemented 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

    ....
}

How could this happen? This adapter is wrapped into HeaderViewListAdapter, but I don't get any class cast exception. Also I didn't get null pointer in getView(). Just on this method.

I see, this issue happen only in android 2. I tried everything and don't reproduce this, bust users still got.

What I miss? Have anyone idea how fix? Or how to determine/reproduce this issue?

Was it helpful?

Solution

By introducing a header or footer into your list view, you're changing the positions of your objects.

That is, if you have 1 header view, adapter.getItem(0) will return the object you used in listView.addHeaderView(view, object, isSelectable). If you're only using listView.addHeader(view), then object is null and isSelectable is true.

You can either compare the position in the onItemClick listener to known header / footer positions, or call listView.addHeaderView(view, null, false), which will also disable the select & touch states for the header view.

The position in your adapter isn't effected (0 is still the first item in your list) because the wrapping adapter adjusts the position: line ~175 @ https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/HeaderViewListAdapter.java

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top