0

我在Crashlytics中從一些用戶那裏得到了奇怪的NullPointerException。怎麼可能點擊ListView中的空項目?

我有適配器,它是從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; 
    } 

    .... 
} 

正如你看到的,如果我把空到該適配器爲我在的NullPointerException getView(.. 。) 方法。但我不

我有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.我嘗試了一切,並沒有重現這一點,胸圍用戶仍然得到。

我想念什麼?有誰知道如何修復?或者如何確定/重現這個問題?

回答

2

通過在列表視圖中引入頁眉或頁腳,可以改變對象的位置。

也就是說,如果您有1個標題視圖,adapter.getItem(0)將返回您在listView.addHeaderView(view, object, isSelectable)中使用的對象。如果您只使用listView.addHeader(view),則object爲null,isSelectable爲true。

您可以將onItemClick偵聽器中的位置與已知的頁眉/頁腳位置進行比較,或者調用listView.addHeaderView(view, null, false),這也將禁用選項&觸摸狀態以用於標題視圖。

在適配器中的位置沒有影響(0仍是第一項在列表中),因爲包裝適配器調整的位置:行〜175 @https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/HeaderViewListAdapter.java

+0

我已經使用'listView.addHeaderView(視圖, null,false)'但用戶仍然可以點擊標題。也許這是來自android的錯誤。 – neworld

+0

你有沒有使用addFooterView(view)的頁腳?否則,是否有可能改變支持數組的列表而不調用notifyDataSetChanged(orInvalidated) – FunkTheMonk

+0

我的頁腳也一樣。我不考慮你的下一個問題,因爲'ArrayList'更新拋出了異常或'getView()'拋出空指針,但是我一直只在'OnItemClickListener'中得到。 – neworld