7

Mam główną aktywność, która ma 2 fragmenty. Głównym działaniem jest SearchView na pasku akcji. Oba fragmenty mają listę dużej liczby ciągów, List<String>.Przekazywanie danych do przeszukiwania aktywności

Przepływ jest:

Użytkownik wchodzi Fragment I -> Wybiera ciąg (powiedzmy Selection1) -> Na podstawie Selection1 listą ciągów jest wypełniana w drugim fragmencie - -> Tutaj użytkownik wybiera drugi ciąg ---> Przetwarzanie na podstawie tych dwóch ciągów.

Teraz ponieważ oba fragmenty zawierają dużą liczbę ciągów, użytkownik wpisze zapytanie w SearchView, który filtruje listę i redukuje go do mniejszego listy wyświetlanej w SearchableActivity.

Teraz problem polega na tym, w jaki sposób SearchableActivity uzyskuje dostęp do tych dwóch List<String>, aby je filtrować w oparciu o zapytanie i wyświetlać zmniejszoną listę użytkownikowi.

Obecnie co zrobiłem jest przesłonięta onSearchRequested i przekazać te dane jako

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

Czy istnieje lepszy sposób lub standardowy sposób za pomocą których ten problem może być obsługiwane czyli implementacji, który pozwala danych opierać od mojego MainActivity do SearchableActivity?

Edytuj: Dodawanie kodu. Pokazuje, jak dane są ustawione w Fragment. onDataReceived jest wywoływana z HttpManager, która odbiera dane.

@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

Może ten link mógłby Ci pomóc – prat

+0

Czy możesz pokazać swój kod, w jaki sposób uzyskujesz i wyświetla dane, a następnie otrzymujesz dane użytkownik wybrał proszę? Łatwiej będzie na to odpowiedzieć, niż napisać uogólnioną odpowiedź. –

+0

@Heyyou Dane to w zasadzie 'Lista ' zawarta w powiedzmy Fragment A. Ale SearchableActivity nie ma dostępu do tej listy. Nie wiem, jaki kod jest potrzebny do wklejenia tutaj, aby wyjaśnić to dalej. – unrealsoul007

Odpowiedz

1

Okay ... Tak to zrobiłem.

Zasadniczo dane otrzymane w dwóch fragmentach nie były po prostu List<String>, ale były to viz modelki. Kino i region, który zawierał dane inne niż nazwami w tym miejscu, rating itp

Więc, po pierwsze, zrobiłem interfejs 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(); 
} 

modele Zarówno Kino i region realizowany ISearchable.

Po tym użyłem pojedynczej klasy DataManager, w której utrzymałem 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; 
    } 

} 

Więc gdy fragment (albo Fragment_A lub Fragment_B) jest załadowany, aktualizuje ten currentSearchList, tak, że gdy SearchableActivity wykonuje wyszukiwać wszystko, co ma zrobić, to DataManager.getInstance().getSearchList() a następnie użyć tej listy na filtrowanie listy pasujące przedmioty.

W ten sposób radziłem sobie z problemem posiadania Listy w Działalności innej niż Wyszukiwalność, za pomocą której należy przeprowadzić wyszukiwanie.

Rozumiem, że to może nie być najlepsze rozwiązanie, więc czekam na sugestie i uwagi krytyczne, i wykorzystam to, aby znaleźć lepsze rozwiązanie.

1

po prostu odpowiedział na podobne pytanie kilka minut temu, o godzinie how can I send a List into another activity in Android Studio

zachęcam do przemyślenia swój wzór prostu przekazywanie danych między Działania wokół i fragmenty. Rozważ utworzenie jednego lub więcej modeli danych (klas innych niż Android) dla swojej aplikacji i udostępnienie tych modeli klasom Android (Działania, Fragmenty itp.), Które ich potrzebują.

Usuń cały kod do przechowywania danych i manipulacji z czynności i fragmentów i umieść go w modelu (ach).

+0

Cały mój kod przechowywania danych jest w modelach danych, a nie w działaniach lub fragmentach. Właśnie wspomniałem 'List ' w Fragment dla łatwości zrozumienia. Dziękuję za odpowiedź, ale już korzystałem z wzorca Singleton i szukałem czegoś lepszego. – unrealsoul007