0

일부 사용자의 Crashlytics에서 이상한 NullPointerException이 발생했습니다.ListView에서 null 항목을 클릭하는 방법은 무엇입니까?

내가 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); 
    } 

    .... 
} 

그리고 콘크리트 클래스 :

나는의 getView에서 NullPointerException이 (이 어댑터 I에 null을 넣으면 보시다시피
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; 
    } 

    .... 
} 

.. .) 방법. 그러나 나는 그렇지 않다.

나는이 구체적인 클래스와 연결된 인스턴스화 된 형태의 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() null 포인터를 얻지 못했습니다. 이 방법을 사용하면됩니다.

나는이 문제가 안드로이드 2에서만 일어난다는 것을 알았다. 나는 모든 것을 시도했지만 이것을 재현하지 못했다.

내가 놓친 것? 아무도 아이디어를 고쳐서 어떻게 고쳐 줄까? 또는이 문제를 확인/재현하는 방법은 무엇입니까?

답변

2

목록보기에 머리글이나 바닥 글을 추가하면 개체의 위치가 변경됩니다.

즉, 헤더보기가 1 개인 경우 adapter.getItem(0)listView.addHeaderView(view, object, isSelectable)에서 사용한 개체를 반환합니다. listView.addHeader(view) 만 사용하는 경우 object는 null이고 isSelectable은 true입니다.

onItemClick 수신기의 위치를 ​​알려진 머리글/바닥 글 위치와 비교하거나 을 호출하여 헤더보기에 대해 선택 & 터치 상태를 비활성화 할 수 있습니다. 이미`listView.addHeaderView (뷰를 사용하는 라인 ~ 175

+0

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/widget/HeaderViewListAdapter.java @ : 포장 어댑터 위치를 조정하기 때문에

영향을받지되는 어댑터의 위치 (0 목록에 여전히 첫 번째 항목입니다) null, false)'하지만 어떻게 든 사용자는 여전히 헤더를 클릭 할 수 있습니다. 아마 이것은 안드로이드의 버그입니다. – neworld

+0

addFooterView (view)를 사용하여 꼬리말이 있습니까? 그렇지 않으면 notifyDataSetChanged (orInvalidated)를 호출하지 않고 배열을 백업하는 목록을 변경하는 것이 가능합니까 – FunkTheMonk

+0

바닥 글과 동일하게 수행했습니다. 'ArrayList'보다 새로운 것이 경계 예외를 던지거나'getView()'가 널 포인터를 던 졌기 때문에 당신의 다음 문제를 생각하지 않습니다. 그러나 전체 시간에는'OnItemClickListener' 만 있습니다. – neworld

관련 문제