Jeśli mamy dwa działania:
- Lista plików i czas ostatniej modyfikacji
- Czynności związane z edycją plików
Użytkownik wybiera plik z listy i zostaje przeniesiony do czynności edycji pliku. Po zakończeniu edycji użytkownik naciska przycisk Wstecz, aby powrócić do listy plików.
Lista nie jest ładowana ponownie i dlatego wyświetlana jest niepoprawna wartość czasu modyfikacji właśnie edytowanych plików.
Jaka jest właściwa metoda spowodowania odświeżenia listy plików po naciśnięciu przycisku Wstecz?
W tym przykładzie przyjęto założenie, że nie jest używana żadna baza danych, tylko ArrayAdapter.
Odpowiedzi:
Jedną z opcji byłoby skorzystanie z funkcji onResume pierwszej aktywności.
@Override public void onResume() { // After a pause OR at startup super.onResume(); //Refresh your stuff here }
Możesz też rozpocząć działanie dla wyniku:
Intent i = new Intent(this, SecondActivity.class); startActivityForResult(i, 1);
W secondActivity jeśli chcesz odesłać dane:
Intent returnIntent = new Intent(); returnIntent.putExtra("result",result); setResult(RESULT_OK,returnIntent); finish();
jeśli nie chcesz zwracać danych:
Intent returnIntent = new Intent(); setResult(RESULT_CANCELED, returnIntent); finish();
Teraz w swojej klasie FirstActivity napisz następujący kod
onActivityResult()
metodyprotected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { if(resultCode == RESULT_OK){ //Update List } if (resultCode == RESULT_CANCELED) { //Do nothing? } } }//onActivityResult
źródło
onResume
nie wzywał mnie, jakiś pomysł dlaczego? ( PróbowałemonRestart
ionPause
też, ale żaden z nich nie nazywa )Myślę, że onRestart () działa lepiej w tym przypadku.
@Override public void onRestart() { super.onRestart(); //When BACK BUTTON is pressed, the activity on the stack is restarted //Do what you want on the refresh procedure here }
Możesz zakodować, co chcesz zrobić, gdy działanie zostanie ponownie uruchomione (wywołane ponownie ze zdarzenia „naciśnięto przycisk wstecz”) w onRestart ().
Na przykład, jeśli chcesz zrobić to samo, co robisz w onCreate (), wklej kod w onRestart () (np. Rekonstruując interfejs użytkownika ze zaktualizowanymi wartościami).
źródło
w zasadzie:
@Override public void onRestart() { super.onRestart(); finish(); startActivity(getIntent()); }
źródło
Zalecałbym nadpisanie
onResume()
metody w działaniu numer 1 i dołączenie kodu odświeżającego adapter tablicy, odbywa się to za pomocą[yourListViewAdapater].notifyDataSetChanged();
Przeczytaj, jeśli masz problem z odświeżeniem listy: Odśwież widok listy Androida
źródło
Jeśli chcesz odświeżyć poprzednią aktywność, to rozwiązanie powinno działać:
W poprzedniej czynności, w której chcesz odświeżyć:
@Override public void onRestart() { super.onRestart(); // do some stuff here }
źródło
private Cursor getAllFavorites() { return mDb.query(DocsDsctnContract.DocsDsctnEntry.Description_Table_Name, null, null, null, null, null, DocsDsctnContract.DocsDsctnEntry.COLUMN_Timest); } @Override public void onResume() { // After a pause OR at startup super.onResume(); mAdapter.swapCursor(getAllFavorites()); mAdapter.notifyDataSetChanged(); } public void swapCursor(Cursor newCursor){ if (mCursor!=null) mCursor.close(); mCursor = newCursor; if (newCursor != null){ mAdapter.notifyDataSetChanged(); } }
Mam tylko kategorię ulubionych, więc po kliknięciu pozycji z ulubionych pojawiają się takie informacje i jeśli mi się nie podoba - ta pozycja powinna zostać usunięta z Ulubionych: w tym celu odświeżam bazę danych i ustawiam ją na adapter (do recyklingu) [Życzę zrozumie mój problem i rozwiązanie]
źródło
@Override protected void onRestart() { super.onRestart(); finish(); overridePendingTransition(0, 0); startActivity(getIntent()); overridePendingTransition(0, 0); }
W poprzednim ćwiczeniu użyj tego kodu. Spowoduje to płynne przejście i ponowne załadowanie czynności, gdy wrócisz, naciskając przycisk Wstecz.
źródło
Jeśli nie obsługujesz wywołania zwrotnego z czynności edycyjnej (z onActivityResult), wolałbym raczej umieścić logikę, o której wspomniałeś w onStart (lub prawdopodobnie w onRestart), ponieważ posiadanie go w onResume wydaje się po prostu przesadą, biorąc pod uwagę, że zmiany następują dopiero po onStop.
W każdym razie zapoznaj się z cyklem życia działania . Ponadto zwróć uwagę na metody onRestoreInstanceState i onSaveInstanceState, które nie pojawiają się na ładnym diagramie cyklu życia.
(Warto również sprawdzić, jak samouczek Notatnika obsługuje to, co robisz, chociaż korzysta z bazy danych).
źródło
Najlepszym sposobem na to jest użycie
Intent i = new Intent(this.myActivity, SecondActivity.class); startActivityForResult(i, 1);
źródło
Spróbuj tego
public void refreshActivity() { Intent i = new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); }
lub we fragmentach
public void refreshActivity() { Intent i = new Intent(getActivity(), MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); }
I dodaj tę metodę do swojego onBackPressed () jak
@Override public void onBackPressed() { refreshActivity(); super.onBackPressed(); } }
Otóż to...
źródło
@Override public void onBackPressed() { Intent intent = new Intent(this,DesiredActivity.class); startActivity(intent); super.onBackPressed(); }
źródło