2016-05-03 7 views
0

Ich versuche, eine Liste aller verfügbaren Länder und Währungen gleichzeitig zu erhalten. Ich möchte, dass die Ländernamen auf dem Drehfeld angezeigt werden, und wenn der Benutzer das Land auswählt, wird das Währungssymbol zurückgegeben. Meine Methode funktioniert, aber ich denke, es ist sehr schlecht Übung, weil es dauert 3-2 Sekunden, um die Daten zu laden. Ich habe es wie folgt aus:Wie erhält man Länder und Währungen?

public ArrayList<CurrencyModel> getCountriesAndCurrency(){ 
     ArrayList<CurrencyModel> result = new ArrayList<>(); 
     ArrayList<Locale> list = new ArrayList<>(Arrays.asList(Locale.getAvailableLocales())); 
     for (int i = 0; i <list.size(); i++) { 
      String country = list.get(i).getDisplayCountry(); 
      try { 
       Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry()); 
       String code = Currency.getInstance(pickedLocal).getCurrencyCode(); 
       Currency currency = Currency.getInstance(code); 
       String currencySymbol = currency.getSymbol(pickedLocal); 
       if(currencySymbol.length()>1){ 
        currencySymbol = currency.getSymbol(); 
       } 
       result.add(new CurrencyModel(list.get(i), country, currencySymbol)); 
      } catch (Exception e) { 
      } 
     } 
     Collections.sort(result, new CustomComparator()); 
     ArrayList<CurrencyModel> finalRes = new ArrayList<>(); 
     for (int i = 0; i < result.size(); i++) { 
      try { 
       if(!result.get(i).getCountryName().equals(result.get((i+1)).getCountryName())) { 
        finalRes.add(result.get(i)); 
       } 
      }catch (Exception e){} 
     } 
     Collections.sort(finalRes, new CustomComparator()); 
     return finalRes; 
    } 

    public class CustomComparator implements Comparator<CurrencyModel> { 
     @Override 
     public int compare(CurrencyModel o1, CurrencyModel o2) { 
      return o1.getCountryName().compareTo(o2.getCountryName()); 
     } 
    } 

Currency Objekt = locale locale, String country, String currency.

gibt es eine bessere Lösung für diese Aktion?

+0

Sie können es in sharedPreferences speichern/zwischenspeichern, wenn Sie es zuerst erhalten, wenn es zu viel Zeit braucht. – Devrim

+0

Ich habe die Antwort mit mehr Verbesserungen aktualisiert (angenommen) bitte überprüfen und die Ergebnisse zurück, wenn Sie Verbesserungen hatten – Yazan

Antwort

1

gefunden paar Dinge könnten Sie helfen, wenn auch nicht sicher, ob sie das Ergebnis deutlich

1- Locale Wieder instanziiert verbessern wird Locale pickedLocal = new Locale(list.get(i).getISO3Language(), list.get(i).getCountry()); warum Sie das Gebietsschema neu erstellen, eine locale Attribute verwenden? Sie es einfach zuordnen müssen:

Locale pickedLocal = list.get(i); 

2- für Währungs gleiche,

String code = Currency.getInstance(pickedLocal).getCurrencyCode(); 
Currency currency = Currency.getInstance(code); 
String currencySymbol = currency.getSymbol(pickedLocal); 

wie ich sie verstehe, ist Ihr Ziel currencySymbol bekommen, so tun Sie es einfach so:

String currencySymbol = Currency.getInstance(pickedLocal).getSymbol(); 

so sollte der letzte Block des Codes (der mit try-catch) wie folgt aussehen

try { 
    Locale pickedLocal = list.get(i); 
    String currencySymbol = Currency.getInstance(pickedLocal).getSymbol(); 
    if(currencySymbol.length()>1){ 
     currencySymbol = currency.getSymbol(); 
    } 
    result.add(new CurrencyModel(pickedLocal, country, currencySymbol)); 
} catch (Exception e) { 
} 

unter result.add(new CurrencyModel(list.get(i),... Verwenden Sie pickedLocal, holen Sie das Element nicht aus der Liste.

das ist, was ich bisher bekommen habe, werde ich weitere Antworten auf diese Antwort anhängen.

EDIT: einen zweiten Blick in den Code (vielleicht werden Sie die E-Mail „Liste“ zuerst sortieren müssen), fand ich, dass Sie versuchen, Duplikate zu entfernen, nachdem Sie Ergebnisliste zu füllen, wenn Sie die Ergebnisliste überprüfen Bevor Sie ein neues Element hinzufügen, werden Sie die zweite Schleife loswerden

+0

Danke trotzdem .. aber ich benutze nur mit asyncTask und es funktioniert viel schneller – Anna