2011-11-26 9 views
5

파일 시스템 (폴더 당 하나의 활동)을 순회하면서 재귀 적으로 여러 활동 인스턴스를 만드는 앱이 있습니다. 활동 스택에서 앞으로 이동할 때 인 텐트를 통해 데이터를 검색합니다 (예 : 일반 폴더 탐색). 부모 폴더에서 하위 폴더로 이동할 때 앱이 잘 실행됩니다. 파일/폴더 목록이 이전 활동 (아이)과 동일하기 때문에 [뒤로]가는 데 문제가 있습니다. 인터넷에서 폴더 데이터를 다시 검색하고 싶지 않으므로 이전 활동 상태를 추적 할 수 있습니까? 여기에 내 활동 코드가있다. 감사합니다재귀 활동으로 돌아 가기

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(); 
} 

}

답변

0

Saving Android Activity state using Save Instance State

기본적으로 확인하시기 바랍니다, 당신은 당신이 번들 (onSaveInstanceState)에 저장하고 onRestoreInstanceState

에 그들을 검색 할 일을 저장, public void onSaveInstanceState(Bundle savedInstanceState)public void onRestoreInstanceState(Bundle savedInstanceState)을 사용하는 것이 좋습니다

희망이 도움이됩니다.

1

질문에 답변하지 않지만 새로운 활동을 만들 때마다 Fragments을 사용 하시겠습니까?

Fragment에 목록 항목을 표시하고 폴더를 열 때마다 RisorseActivity을 다시 만드는 대신 이전 조각을 새 것으로 바꿀 것입니다.

또한 조각을 커밋하기 전에 조각 트랜잭션의 백 스택에 트랜잭션을 추가하기 위해 addToBackStack()을 호출해야합니다. 이 백 스택은 액티비티에 의해 관리되며 사용자는 뒤로 버튼을 눌러 이전 조각 상태로 돌아갈 수 있습니다.

이렇게하면 돌아갈 때 스택의 이전 조각이 팝업되고 다시 데이터가 다운로드되지 않습니다.

0

이 경우 경로에 폴더 스택을 저장하고 뒤로 버튼을 조작하는 단일 인스턴스로 단일 활동을 갖는 것이 좋습니다. 스택에 여러 활동을 갖는 것보다 효율적입니다.

관련 문제