2011-08-24 66 views
1

我有以下問題時:安卓:空指針上的ListItem點擊呼叫showContextMenuForChild

我顯示在一個ListView項目,我想顯示一個ContextMenu的項目,如果用戶點擊它。所以我所做的是,添加OnItemClickListener用下面的代碼:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    if (view == null) { 
     return; 
    } 
    if (sessionListView == null) { 
     sessionListView = (SessionListView) findViewById(R.id.sessionlist); 
    } 

    if (view != null) { 
     sessionListViewSelected = position; 
     sessionListViewSelectedKey = (String) authList.keySet().toArray()[position]; 

     sessionListView.showContextMenuForChild(view); 
    } 
} 

現在,有時候我以下錯誤:

FATAL EXCEPTION: main 
java.lang.NullPointerException 
    at android.widget.AdapterView.getPositionForView(AdapterView.java:581) 
    at android.widget.AbsListView.showContextMenuForChild(AbsListView.java:1926) 
    at de.trier.infsec.koch.droidsheep.activities.ListenActivity.onItemClick(ListenActivity.java:322) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
    at android.widget.ListView.performItemClick(ListView.java:3513) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1849) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3835) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 
    at dalvik.system.NativeStart.main(Native Method) 

是否有人有意見,什麼可能是什麼問題?

謝謝!

+0

難道它會顯示在你改變的ListView的內容是什麼? –

+0

是的,還有另一個線程,它改變了ListAdapter和一個處理程序刷新列表......可能這會導致問題? –

+0

這裏有一些關於'getPositionForView()'拋出'NullPointerException'的信息,並解釋它爲什麼會發生: http://code.google.com/p/android/issues/detail?id=3175 –

回答

0

這個問題可能是因爲你是從單獨的線程更新ListAdapter而引起的。你應該只改變UI元素(或UI元素依賴的類)from UI thread

嘗試使用此方法更新UI線程數據:

listAdapter.getView().post(new Runnable() { 
    public void run() { 
     // change listAdapter here 
    } 
    });