2013-10-31 40 views
0

試圖找出如何通過超級構造函數來阻止這個NPE,任何人都可以幫忙嗎?super(context,textviewid); java.lang.NullPointerException

MainActivity.java

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     ((DownloadFragment) downloads).refreshlist(); 
    } 
} 

DownloadFragment.java

public class MyAdapter extends ArrayAdapter<AdapterItem> { 
    public MyAdapter(Context context, int textviewid) { 
     super(context, textviewid); // NPE here 
    } 

    public void refreshlist() { 
     items.clear(); 
     adapter = new MyAdapter(getActivity(), 0); 
     // ... 
    } 
} 

例外:

java.lang.NullPointerException 
at android.widget.ArrayAdapter.init(ArrayAdapter.java:310) 
at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104) 
at com.DownloadFragment$MyAdapter.<init>(DownloadFragment.java:142) 
at com.DownloadFragment.refreshlist(DownloadFragment.java:479) 
at com.MainActivity.onWindowFocusChanged(MainActivity.java:387) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.onWindowFocusChanged(PhoneWindow.java:2466) 
at android.view.View.dispatchWindowFocusChanged(View.java:7456) 
at android.view.ViewGroup.dispatchWindowFocusChanged(ViewGroup.java:935) 
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:3264) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:153) 
at android.app.ActivityThread.main(ActivityThread.java:5297) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
at dalvik.system.NativeStart.main(Native Method) 

無在執行此操作後,refreshList()方法中的下一行將爲null。

@Override public void onActivityCreated(Bundle savedInstanceState){ super.onActivityCreated(savedInstanceState); adapter = new MyAdapter(getActivity(),0); }

DownloadFragment.java

Cursor a = mDbHelper.getEachDownload(2); 
+0

請張貼一個完整的堆棧跟蹤。 – flx

+0

你在哪裏初始化了「適配器」? –

+0

你有什麼打算使用onWindowFocusChanged?你通常不會覆蓋這個。也許還有另一個生命週期回調,你應該根據你的意圖使用哪些回調建議? – jagsaund

回答

0

我相信這是因爲你傳遞一個空的上下文。

嘗試:

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     ((DownloadFragment) downloads).refreshlist(this); 
    } 
} 

DownloadFragment.java

public class MyAdapter extends ArrayAdapter<AdapterItem> { 
    public MyAdapter(Context context, int textviewid) { 
     super(context, textviewid); // NPE here 
    } 

    public void refreshlist(Context context) { 
     items.clear(); 
     adapter = new MyAdapter(context, 0); 
     // ... 
    } 
} 

你們是不是要刷新新的數據適配器?你有沒有嘗試notifyDataSetChanged()?

public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     DownloadFragment.adapter.notifyDataSetChanged(); 
    } 
} 
+0

是的,因爲我創建的MainActivity是singleTask,所以多個實例不需要創建,列表刷新焦點。 –

+0

10-31 17:11:00.620:E/AndroidRuntime(15909):java.lang.IllegalMonitorStateException:對象不是由線程鎖定之前通知() 公共無效onWindowFocusChanged(布爾hasFocus){ \t \t超級。onWindowFocusChanged(hasFocus); \t \t如果(hasFocus){ \t \t \t DownloadFragment.adapter.notify(); \t \t \t DownloadFragment.adapter.notifyDataSetChanged(); \t \t} \t} –

+0

DownloadFragment.adapter.notifyDataSetChanged();工作謝謝你! –

0

getActivity()在片段類方法,直到它連接到活動即直到onAttach(活動)方法被調用返回null。所以最好在Fragment的onActivityCreated()方法中爲MyAdapter類創建對象。

試試這個...

public class DownloadFragment extends Fragment { 
    private MyAdapter adapter; 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     adapter = new MyAdapter(getActivity(),0); 
    } 
} 
+0

請舉例子? –

+0

編輯答案...檢查它 –

+0

你必須調用refreshList()方法,當Fragment被附加到活動只... –

0

適配器應該喜歡這個

package com.example.demo; 

import java.util.ArrayList; 

import android.content.Context; 
import android.database.DataSetObserver; 
import android.util.Log; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 

public class SmartListAdapterWithHolder extends ArrayAdapter<AdapterItem> { 

    private Context context; 
    private ArrayList<String> items; 

    public SmartListAdapterWithHolder(Context context, int resource, ArrayList<AdapterItem> items) { 
     super(context, resource, items); 
     this.items = items; 
     this.context = context; 
    } 

    public ArrayList<AdapterItem> getSmartListItems() { 
     return items; 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     Log.v("SmartListAdapter", observer.toString()); 
     super.registerDataSetObserver(observer); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     return convertView; 
    } 

} 
相關問題