2013-03-15 21 views
10

Muszę zaktualizować listview w fragmencie, jeśli plik zostanie pobrany pomyślnie. Więc w moim menedżer pobierania za BroadcastReceiver zarejestrować ten nowy odbiornik nadanie:Zaktualizuj listview w fragmencie z odbiornika broadcast

Intent intent = new Intent(); 
intent.setAction("CONTENTS_NOTIFICATION"); 
context.sendBroadcast(intent); 

I w moim fragmentu w onCreateView dodać następujący kod w celu zarejestrowania odbiornika:

IntentFilter filter = new IntentFilter("CONTENTS_NOTIFICATION"); 
getActivity().getApplicationContext().registerReceiver(myReceiver, filter); 

następnie:

private BroadcastReceiver myReceiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 

      SQLiteDatabase db = DatabaseManager.getInstance(getActivity()).getWritableDatabase(); 
       c = SelectedExperience.getSelectedExperiences(db); 

       String id_esperienza = "Selected Experience"; 

       if (c.getCount() != 0) { 
        id_esperienza = c.getString(c.getColumnIndex(SelectedExperience.ID_ESPERIENZA)); 
       } 

      populateListview(v, id_esperienza); 

     } 
    }; 

i na koniec:

public void onDestroyView() { 
     super.onDestroyView(); 
     getActivity().getApplicationContext().unregisterReceiver(myReceiver); 
} 

Muszę dodać dwa z tych odbiorników dla dwóch różnych Fragmentów. Na pierwszym wszystko działa dobrze. Jeśli w aplikacji użytkownik znajduje się na fragmencie, aktualizuje się, podczas gdy na drugim fragmencie dostaję te błędy:

03-15 07:32:40.474: E/AndroidRuntime(1692): FATAL EXCEPTION: main 
03-15 07:32:40.474: E/AndroidRuntime(1692): java.lang.RuntimeException: Error receiving broadcast Intent { act=CONTENTS_NOTIFICATION flg=0x10 } in [email protected] 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:768) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.handleCallback(Handler.java:725) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.os.Looper.loop(Looper.java:137) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.ActivityThread.main(ActivityThread.java:5191) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at dalvik.system.NativeStart.main(Native Method) 
03-15 07:32:40.474: E/AndroidRuntime(1692): Caused by: java.lang.NullPointerException 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.populateListview(ContentsFragment.java:194) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment.access$0(ContentsFragment.java:111) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at sample.actionscontentview.fragment.ContentsFragment$1.onReceive(ContentsFragment.java:107) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:758) 
03-15 07:32:40.474: E/AndroidRuntime(1692):  ... 9 more 

a kod jest taki sam! Nie mogę zrozumieć, dlaczego to nie działa. Mówi, że jest problem z populatelistView, ale ta sama funkcja działa dobrze wewnątrz fragmentu, jeśli nie jest wywołana z odbiornika transmisji.

Jedyna różnica, jaka może mi się wydawać między tymi dwoma fragmentami, polega na tym, że ten, w którym działa aktualizacja, jest pierwszym, który został otwarty po uruchomieniu aplikacji.

+1

co to jest numer wiersza. 194 i opublikuj kod dla populateListView – Atrix1987

+0

My bad ... Błąd był w populatelistView, w szczególności mijam zły widok !! Więc kod działa poprawnie! – phcaze

Odpowiedz

4

Spróbuj użyć EventBus przez GreenRobot https://github.com/greenrobot/EventBus

Gdy plik zostanie pomyślnie pobrane dodać zdarzenie

EventBus.getDefault().post(YourData.Downloaded); 

Twój fragment zarejestruje do odbierania zdarzeń, najlepiej w onStart metoda()

EventBus.getDefault().register(this); 

Będzie otrzymywać zdarzenia w trybie onEvent:

public void onEvent(Data.State) {} 

, a następnie można łatwo zaktualizować listę. Wyrejestrowujesz się również z odbierania zdarzeń w metodzie onStop(). Możesz zachować dane w swojej aplikacji lub zapisane. To bardzo proste i przyjemne rozwiązanie. Mam nadzieję, że to pomoże. Możesz zarejestrować dowolną liczbę fragmentów dla tego wydarzenia, więc gdy EventBus opublikuje wydarzenie, wszystkie dostępne fragmenty zarejestrowane dla niego otrzymają to wydarzenie.

0

wiem, że to jest stary, ale w przypadku możesz mi pomóc z doświadczeniem niż należy zrobić w moim wydaniu:

Pisałem podobne pytanie tutaj: Broadcast receivers and Fragments. Możesz poszukać obejścia, które zrobiłem, chociaż myślę, że powinien być lepszy sposób na zrobienie tego.

Niektórzy proponują, że wszystkie transmisje przechodzą do działania, które hostuje fragmenty i poprzez słuchacza, powiedz fragmentom, że powinny zaktualizować widok w oparciu o to, co zostało odebrane. Może to być lepsze podejście, ale może również obejmować wskaźniki zerowe sprawdzające widok fragmentów.

Powiązane problemy