7

Ich habe eine Hauptaktivität, die 2 Fragmente hat. Die Hauptaktivität hat eine SearchView in der Aktionsleiste. Beide Fragmente haben eine Liste mit einer großen Anzahl von Strings, List<String>.Übergeben von Suchdaten an durchsuchbare Aktivität

Die Strömung ist:

Benutzer gibt Fragment I -> Wählt einen String (lässt Selection1 sagen) -> Basierend auf Selection1 eine Liste von Strings im zweiten Fragment aufgefüllt wird - -> Hier wählt der Benutzer einen zweiten String ---> Processing basierend auf diesen beiden Strings.

Nun, da sowohl die Fragmente eine große Anzahl von Zeichenfolgen enthalten, gibt der Benutzer eine Abfrage in der SearchView, die die Liste filtert und reduziert sie auf eine kleinere Liste im SearchableActivity angezeigt.

Nun ist das Problem, wie die SearchableActivity Zugang zu diesen beiden List<String> erhält, um sie basierend auf der Abfrage zu filtern und eine reduzierte Liste für den Benutzer anzuzeigen.

Zeit, was ich getan habe, ist onSearchRequested außer Kraft gesetzt und die Daten als

@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; 
    } 

Gibt es eine bessere Art und Weise oder Standard-Weg passieren, durch die dieses Problem also eine Implementierung gehandhabt werden kann, mit der Daten beruhen, von meiner MainActivity bis SearchableActivity?

Bearbeiten: Hinzufügen von Code. Zeigt an, wie Daten in Fragment festgelegt werden. onDataReceived wird von der HttpManager aufgerufen, die die Daten empfängt.

@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

Möge dieser Link Ihnen helfen – prat

+0

Können Sie Ihren Code zeigen, wie Sie die Daten erhalten und anzeigen und dann die Daten bekommen Der Benutzer hat bitte ausgewählt? Es wird leichter sein, das spezifisch zu beantworten, als eine allgemeine Antwort zu schreiben. –

+0

@Heyyou Data ist im Grunde 'List ', die in Letters enthalten ist, sagen Sie Fragment A. Aber SearchableActivity hat keinen Zugriff auf diese Liste. Ich weiß nicht, welchen Code ich hier einfügen muss, um dies weiter aufzuklären. – unrealsoul007

Antwort

1

Okay ... So habe ich es gemacht.

Grundsätzlich waren die Daten in den beiden Fragmenten nicht einfach List<String>, aber sie waren Modelle viz. Kino und Region, die anderen Angaben als Namen einschließlich Standort enthalten, Rating usw.

Also erstens habe ich eine Schnittstelle 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(); 
} 

Sowohl das Kino und Region Modelle ISearchable umgesetzt.

Danach habe ich eine Singleton-Klasse DataManager in der ich eine List<ISearchable> currentSearchList gehalten.

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

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

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

} 

Also, wenn ein Fragment (entweder Fragment_A oder Fragment_B) geladen wird, aktualisiert er diesen currentSearchList, so dass, wenn die SearchableActivity führen alle suchen, es zu tun hat, ist DataManager.getInstance().getSearchList() und dann diese Liste verwenden, um eine Liste Ausfiltern von passende Artikel.

So behandelte ich das Problem, Listen in einer anderen Aktivität als der DurchsuchbarenAktivität zu haben, mit der die Suche durchgeführt werden muss.

Ich verstehe, dass dies möglicherweise nicht die beste Lösung ist, so freue ich mich auf Anregungen und Kritik, und damit zu einer besseren Lösung zu kommen.

1

Ich antwortete nur eine ähnliche Frage vor ein paar Minuten, bei how can I send a List into another activity in Android Studio

ich Sie ermutigen, zu überdenken Ihre Musterdaten einfach vorbei um unter Aktivitäten und Fragmente. Erwägen Sie, ein oder mehrere Datenmodelle (Nicht-Android-Klassen) für Ihre Anwendung zu erstellen und diese Modelle den Android-Klassen (Aktivitäten, Fragmente usw.) zur Verfügung zu stellen, die sie benötigen.

Entfernen Sie den gesamten Datenspeicherungs- und Manipulationscode aus Ihren Aktivitäten und Fragmenten, und legen Sie ihn in das/die Modell (e) ein.

+0

Mein gesamter Datenspeichercode befindet sich in Datenmodellen und nicht in Aktivitäten oder Fragmenten. Ich habe gerade 'List ' in Fragment erwähnt, um das Verständnis zu erleichtern. Danke für Ihre Antwort, aber ich hatte bereits Singleton-Muster verwendet und suchte nach etwas Besserem. – unrealsoul007