我在一些用户的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中。我尝试了一切,并没有重现这一点,胸围用户仍然有。
我想念的是什么?有谁知道怎么修复?或者如何确定/重现这个问题?
答案 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