Android 如何在ListView中单击空项?
我在Crashlytics中从一些用户那里得到了奇怪的NullPointerException 我有一个适配器,它是从BaseAdapter实现的: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
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
。