6

Ich habe folgende eigene Interface-Implementierung in meinem Fragment:Nullpointer in restartLoader Methode der LoaderManager

@Override 
    public void onReportChanged(Fragment sender, long id, int position) { 
     // Views ein und ausblenden 
     _List.setVisibility(View.GONE); 
     _OnLoading.setVisibility(View.VISIBLE); 
     _NoDataView.setVisibility(View.GONE); 
     _ReportId = id; 
     getLoaderManager().restartLoader(_LM_REPORTS, null, this); 
    }; 

Der FragmentActivity Bericht zu diesem Fragment, das ein anderes Fragment (Auswahlliste) ein Element ausgewählt haben. Danach sollte das ListFragment neue Daten mit der gemeldeten ID (_ReportId) laden.

Aber ich bekomme NullPoinerException auf diesen Code, bevor Sie onCreateLoader-Methode gehen. Hier ist der LogCat:

05-28 14:24:37.905: E/AndroidRuntime(1775): FATAL EXCEPTION: main 
05-28 14:24:37.905: E/AndroidRuntime(1775): java.lang.NullPointerException 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.support.v4.app.LoaderManagerImpl.restartLoader(LoaderManager.java:637) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.fragment.ReportListFragment.onReportChanged(ReportListFra gment.java:142) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.ReportListActivity.onReportSelected(ReportListActivity.java:97) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at de.webducer.android.worktime.beta.ui.fragment.ReportSelectorSpinnerFragment$1.onItemSelected(ReportSelectorSpinnerFragment.java:78) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:882) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView.access$200(AdapterView.java:48) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:848) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Handler.handleCallback(Handler.java:605) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.os.Looper.loop(Looper.java:137) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
05-28 14:24:37.905: E/AndroidRuntime(1775):  at dalvik.system.NativeStart.main(Native Method) 

Ich verstehe nicht warum. Derselbe Code (aber für die andere Liste) funktioniert gut für die andere FragmentActivity.

Antwort

3

fand ich den Grund:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle extra) { 
    CursorLoader returnValue = null; 
    if (_ReportId > 0) { 
     switch (id) { 
      case _LM_REPORTS: 
       returnValue = new CursorLoader(getActivity(), 
        ReportContentProvider.CONTENT_URI_REPORT_DATA, 
        null, 
        ReportTable.COLUMN_ID + " =?", 
        new String[] { String.valueOf(_ReportId) }, 
        null); 
        break; 

       default: 
        break; 
      } 
     } 
    return returnValue; 
} 

Der Loader haben jeden zu laufen. Die Bedingung if (_ReportId > 1) erzeugte die Ausnahme. Ohne die Bedingung läuft der Code gut.

+0

Ich verstehe immer noch nicht die Erklärung ... Könnten Sie ein wenig mehr ausarbeiten ?? Was bedeutet: "Der Loader muss immer laufen"? – Entreco

+3

Ich glaube, er meint, dass, wenn die _ReportId = -1, es keinen Lader so den Wert von "returnValue = null" erstellen würde. Dann versucht der Lademanager, einen Nullloader zu starten und den Nullzeiger zu werfen. –

+0

whats is id hier gemeldet –

Verwandte Themen