Android 如何在ListView中单击空项?

Android 如何在ListView中单击空项?,android,android-listview,nullpointerexception,android-2.3-gingerbread,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

我在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);
    }

    ....
}
抽象公共类BaseListAdapter扩展BaseAdapter{
私有最终ArrayList项=新ArrayList();
....
@凌驾
公共T getItem(内部位置){
返回项目。获取(位置);
}
....
}
和混凝土等级:

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

    ....
}
class MessagesAdapter扩展BaseListAdapter{
....
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
如果(视图==null)
view=view.inflate(getContext(),R.layout.message\u listitem,null);
MessagesListItem=getItem(位置);
NetworkImageView化身=(NetworkImageView)view.findViewById(R.id.message\u listitem\u化身);
ImageView online=(ImageView)view.findViewById(R.id.message\u listitem\u online);
TextView nick=(TextView)view.findViewById(R.id.message\u listitem\u nick);
TextView预览=(TextView)view.findViewById(R.id.message\u listitem\u预览);
TextView未读=(TextView)view.findViewById(R.id.message\u listitem\u未读);
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);
未读.setText(String.valueOf(item.unread));
未读.setVisibility(item.unread==0?View.GONE:View.VISIBLE);
返回视图;
}
....
}
正如您所看到的,如果我在这个适配器中输入null,那么我将在getView(…)方法中为NullPointerException输入null。但我不知道

我有一个ListView,附带了这个具体类的实例。我已经实现了McClickListener:

@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

    ....
}
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
Adapter=parent.getAdapter();
MessagesListItem MessagesListItem=(MessagesListItem)adapter.getItem(位置);

User User=messagesListItem.getUser();//通过在列表视图中引入页眉或页脚,可以更改对象的位置

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

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


适配器中的位置未受影响(0仍然是列表中的第一项),因为换行适配器调整位置:第175行@

我已经使用了
listView.addHeaderView(视图,null,false)
但用户仍然可以单击页眉。这可能是android的错误。您是否有使用addFooterView(view)的页脚?否则,您是否有可能在不调用notifyDataSetChanged(或Invalidated)的情况下更改支持数组的列表我对footer也做了同样的处理。我不考虑你的下一个问题,因为
ArrayList
New抛出了边界外异常或
getView()
抛出空指针,但整个时间我只得到了
OnItemClickListener