2011-11-26 22 views
5

Mam aplikację, która tworzy rekursywnie wiele wystąpień działania podczas przechodzenia przez system plików (jedno działanie na folder). Pobieram dane za pomocą funkcji Intent podczas przechodzenia do przodu w stosie działań (to jest normalnym przechodzeniu przez folder). Aplikacje działają dobrze, gdy przechodzę z folderu nadrzędnego do folderu podrzędnego. Mam problemy z powrotem [wstecz], ponieważ lista plików/folderów pozostaje taka sama jak poprzednia aktywność (dziecko). Nie chcę odzyskiwać ponownie danych z folderu z Internetu, aby można było śledzić poprzedni stan aktywności? Oto fragment kodu mojej działalności. DziękiPowrót do działania rekursywnego (podobnie do FileSystem)

public class RisorseActivity extends DashboardActivity implements Observer { 
private Docente docente; 
private String get_response; 
private String response; 
//private HttpsClient client; 

private ListView list; 
private RelativeLayout progressLayout; 
private ProgressBar progressBar; 
private TextView txtMateriale; 

private ArrayList<Risorsa> risorseList; 
private RisorseAdapter risAdapter; 
private RisorseList risList; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_risorse); 
    setTitleFromActivityLabel(R.id.title_text); 

    list = (ListView) findViewById(R.id.ListRisorse); 
    list.setClickable(true); 


    Intent intent = getIntent(); 
    // vengono recuperati i parametri dalla activity chiamante 
    docente = (Docente) intent.getSerializableExtra(getPackageName() + ".Docente"); 
    //cartella = (Insegnamento) intent.getSerializableExtra(pkg + ".Insegnamento"); 
    get_response = intent.getExtras().getString("get_response"); 
    response = intent.getExtras().getString("response"); 

    list.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long index) { 
      if (risorseList.get(position).getType().equalsIgnoreCase("Folder")) { 
       Intent intRisorse = new Intent(getApplicationContext(), RisorseActivity.class); 
       intRisorse.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       intRisorse.putExtra(getPackageName() + ".Docente", docente); 
       intRisorse.putExtra("get_response", risorseList.get(position).getURL()); 
       startActivity(intRisorse); 
      } else if (risorseList.get(position).getType().equalsIgnoreCase("File")) { 
       //--------------- DOWNLOAD DEL FILE------------------- 
      } 
     } 
    }); 


    startRisorseService(); 
} 


// Aggiorna la View della Activity popolando la lista dei docenti trovati 
private void updateView() { 

    this.risAdapter = new RisorseAdapter(this, this.risorseList); 
    if (this.risAdapter != null) { 
     this.list.setAdapter(this.risAdapter); 

    } else { 
     Toast.makeText(this, "Errore caricamento lista materiale", 
       Toast.LENGTH_LONG).show(); 
    } 
} 

private void startRisorseService() { 
    // risList conterrà il nostro modello dei dati (l'array di oggetti 
    // Ricevimento) 
    risList = RisorseList.getInstance(); 
    if (risList.countObservers() == 0) 
     risList.addObserver(this); // aggiungiamo la nostra "View" come 
            // osservatore del modello dati 

    loginState = ((LoginState) getApplicationContext()); 

    Handler handler = new RisorseHandler(); 
      //IT IS THE TASK THATH RETRIEVE THE DATA 
    RisorseService task = null; 
    if (response != null){ 
     task = new RisorseService(handler, loginState, response); 
    }else 
     task = new RisorseService(handler, loginState); 
    if (task != null) 
     task.execute(get_response); 
} 

public void update(Observable observable, Object arg1) { 
    if(observable instanceof RisorseList){ 
     // in quanto potremmo avere piu modelli dati 
     // verifichiamo su quale modello è avvenuto un cambiamento dei dati 
     // prima di effettuare il cast 
     this.risorseList = ((RisorseList) observable).getData(); 
    } 
      updateView(); 
    risList.deleteObserver(this); 
} 

public void onClickRefresh(View v) { 
    startRisorseService(); 
} 


@Override 
protected void onResume(){ 
    super.onResume(); 

      // IF I UNCOMMENT THESE LINES IT WORK BUT RETRIEVE DATA FROM INTERNET AGAIN!!! 
    /*if (risAdapter == null) 
     startRisorseService(); 
    else{ 
     risAdapter.notifyDataSetChanged(); 

    }*/ 
    if (risAdapter != null) 
    updateView(); 
} 

}

Odpowiedz

0

Proszę sprawdzić Saving Android Activity state using Save Instance State

Zasadniczo, będziemy chcieli, aby korzystać public void onSaveInstanceState(Bundle savedInstanceState) i public void onRestoreInstanceState(Bundle savedInstanceState), zapisać rzeczy, które chcesz zapisać na Bundle (onSaveInstanceState) i pobierać je na onRestoreInstanceState

Mam nadzieję, że to pomoże!

1

To nie odpowie na twoje pytanie, ale czy rozważałeś użycie Fragments zamiast tworzyć za każdym razem nowe działanie?

Chodzi o to, że można wyświetlać elementy listy w postaci Fragment, a zamiast odtwarzać RisorseActivity za każdym razem, gdy folder zostanie otwarty, należy zamienić stary fragment na nowy.

Ponadto, przed zatwierdzeniem fragmentu, należy wywołać addToBackStack(), aby dodać transakcję do tylnego stosu transakcji fragmentów. Ten stos powrotny jest zarządzany przez działanie i pozwala użytkownikowi powrócić do poprzedniego stanu fragmentu, naciskając przycisk Wstecz.

W ten sposób, po powrocie, pojawi się poprzedni fragment ze stosu i żadne dane nie zostaną pobrane ponownie.

0

W takim przypadku lepiej jest mieć pojedyncze działanie z pojedynczą instancją, która zapisuje własny stos folderów na ścieżce i obsługuje przycisk Wstecz. Jest wydajniejszy niż wiele działań na stosie.