7

Ho un'attività principale con 2 frammenti. L'attività principale ha un SearchView nella barra delle azioni. Entrambi i frammenti hanno un elenco di un numero elevato di stringhe, List<String>.Passaggio dei dati di ricerca alle attività ricercabili

Il flusso è: entra

utente Fragment I -> Seleziona una stringa (diciamo selezione1) -> In base a selezione1 una lista di stringhe è popolata nel secondo frammento - -> Qui l'utente seleziona una seconda stringa ---> Elaborazione basata su queste due stringhe.

Ora poiché sia ​​i frammenti contengono un gran numero di stringhe, l'utente immette una query nel SearchView, che filtra l'elenco e lo riduce a un piccolo elenco visualizzato nel SearchableActivity.

Ora il problema è come l'SearchableActivity ottiene l'accesso a questi due List<String> per filtrarli in base alla query e visualizzare un elenco ridotto all'utente.

Attualmente quello che ho fatto è sovrascritti onSearchRequested e passare i dati come

@Override 
    public boolean onSearchRequested() 
    { 
     Bundle appData = new Bundle(); 
     appData.putString(FRAGMENT_ID, "Fragment_A"); 
     appData.putStringArrayList(SEARCH_LIST, searchList); 
     startSearch(null, false, appData, false); 
     return true; 
    } 

C'è un modo migliore o un modo standard con cui questo problema può essere gestito vale a dire un'implementazione che consente ai dati di essere basata dalla mia MainActivity a SearchableActivity?

Modifica: aggiunta di codice. Mostra come sono impostati i dati nel Fragment. onDataReceived viene chiamato dallo HttpManager che riceve i dati.

@Override 
public void onDataReceived(String type,final Object object) 
{ 
    switch(type) 
    { 
     case PopItConstants.UPDATE_LIST: 
      getActivity().runOnUiThread(new Runnable() { 
       @Override 
       public void run() 
       { 
        updateCinemaList((List<String>) object); 
       } 
      }); 
      break; 
    } 
} 

public void updateDataList(List<String> data) 
{ 
    this.dataList = data; 
    spinner.setVisibility(View.GONE); 
    mAdapter.updateList(dataList); 
} 
+0

Questo link potrebbe essere d'aiuto – prat

+0

Puoi mostrare il tuo codice di come stai ricevendo e visualizzando i dati e quindi ottenere i dati l'utente ha selezionato per favore? Sarà più facile rispondere specificamente che scrivere una risposta generalizzata. –

+0

@Heyyou I dati sono fondamentalmente 'Elenco ' che è contenuto nel diremo Frammento A. Ma SearchableActivity non ha accesso a questo elenco. Non so quale codice devo incollare qui per chiarire ulteriormente. – unrealsoul007

risposta

1

Okay ... Quindi è così che l'ho fatto.

Fondamentalmente, i dati ricevuti nei due frammenti non erano semplicemente List<String> ma erano modelli vale a dire. Cinema e Regione che conteneva dettagli diversi nomi, tra cui posizione, rating ecc

Quindi, in primo luogo, ho fatto un'interfaccia ISearchable

public Interface ISearchable 
{ 
    // This contains the Search Text. An ISearchable item is included 
    // in search results if query is contained in the String returned by this method 
    public String getSearchText(); 

    //This is meant to return the String that must be displayed if this item is in search results 
    public String getDisplayText(); 

    //This is meant to handle onClick of this searchableItem 
    public void handleOnClick(); 
} 

modelli Sia il Cinema e Regione implementati ISearchable.

Dopo questo, ho usato una classe singleton DataManager in cui ho mantenuto uno List<ISearchable> currentSearchList.

public class DataManager 
{ 
    .....<singleton implementation>.... 
    List<ISearchable> currentSearchList; 

    public void setSearchList(List<ISearchable> searchList) 
    { 
     this.currentSearchList = searchList; 
    } 

    public List<ISearchable> getSearchList() 
    { 
     return this.currentSearchList; 
    } 

} 

Così ogni volta che viene caricato un frammento (sia Fragment_A o Fragment_B), si aggiorna questo currentSearchList, in modo che quando i SearchableActivity effettua la ricerca tutto ciò che ha a che fare è DataManager.getInstance().getSearchList() e quindi utilizzare questo elenco per filtrare un elenco di articoli corrispondenti.

Questo è il modo in cui ho gestito il problema di avere elenchi in attività diversi da SearchableActivity utilizzando quale ricerca deve essere eseguita.

Capisco che questa potrebbe non essere la soluzione migliore, quindi non vedo l'ora di ricevere suggerimenti e critiche, e di utilizzarla per arrivare a una soluzione migliore.

1

ho solo risposto a una domanda simile pochi minuti fa, alle how can I send a List into another activity in Android Studio

vi incoraggio a ripensare il vostro modello di semplice passaggio di dati in giro tra Attività e Frammenti. Prendi in considerazione la possibilità di creare uno o più modelli di dati (classi non Android) per la tua applicazione e rendere questi modelli disponibili per le classi Android (Attività, Frammenti, ecc.) Che ne hanno bisogno.

Rimuovere tutti i dati di archiviazione e codice di manipolazione dalle attività e dai frammenti e inserirli nei modelli.

+0

Tutto il mio codice di archiviazione dati è in Modelli dati e non in Attività o Frammenti. Ho appena citato 'Elenco ' in Fragment per la facilità di comprensione. Grazie per la tua risposta, ma stavo già usando il pattern Singleton e stavo cercando qualcosa di meglio. – unrealsoul007

Problemi correlati