2017-12-31 26 views
0

Ich versuche mir selbst beizubringen, wie man REST-APIs in Android Studio verwendet. Ich bin sehr neu in der Android-Entwicklung als Ganzes und dies wird erst das zweite Mal sein, dass ich eine REST-API verwendet habe. Ich habe versucht, ein paar Tutorials auf YouTube zu folgen, aber ich habe immer noch Probleme und ich habe das Gefühl, dass die Lösung sehr einfach sein wird und ich werde mich sehr dumm fühlen, besonders seit ich RetroFit benutze ... ich möchte nur die Pokemon-Namen sehen, die in der Listenansicht angezeigt werden (zumindest jetzt).Ich kann JSON nicht in einer Listenansicht analysieren lassen (Pokeapi)

Hier sind meine Code-Dateien

public class MainActivity extends AppCompatActivity { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ListView listView = (ListView) findViewById(R.id.listView); 

     Retrofit retrofit = new Retrofit.Builder() 
       .baseUrl(Pokeapi.URL) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     Pokeapi pokeapi = retrofit.create(Pokeapi.class); 


     Call<List<Pokemon>> call = pokeapi.getPokemonNameAndPic(); 

     call.enqueue(new Callback<List<Pokemon>>() { 
      @Override 
      public void onResponse(Call<List<Pokemon>> call, Response<List<Pokemon>> response) { 
       List<Pokemon> pokemon = response.body(); 

        String[] pokemonNames = new String[pokemon.size()]; 

        for (int i = 0; i < pokemon.size(); i++) { 

         pokemonNames[i] = pokemon.get(i).getName(); 
        } 
        listView.setAdapter(
          new ArrayAdapter<String>(
            getApplicationContext(), 
            android.R.layout.simple_list_item_1, 
            pokemonNames 
          ) 
        ); 

       } 


      @Override 
      public void onFailure(Call<List<Pokemon>> call, Throwable t) { 
       Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 
} 

_

public interface Pokeapi { 

String URL = "https://pokeapi.co/api/v2/"; 

@GET("pokemon") 
Call<List<Pokemon>> getPokemonNameAndPic(); 

} 

_

public class Pokemon { 

private String url; 
private String name; 

public Pokemon(String url, String name) { 
    this.url = url; 
    this.name = name; 
} 

public String getUrl() { 
    return url; 
} 

public String getName() { 
    return name; 
} 
} 

Jede Hilfe ist sehr zu schätzen! Danke :)

https://github.com/Elvargy/PokeAPI-Test

+1

Sind Sie in der Lage, um die Json Antwort zu erhalten, wenn ja bitte die JSON Antwort –

+0

@SonuSanjeev Post - Ich habe den Link zu meinem Repo, wenn Sie würde hinzugefügt Möchtest du es selbst ausprobieren? :) –

+0

Bitte posten Sie alle Fehler, die Sie auch festgestellt haben. Erhalten Sie irgendwelche Rückmeldungen/Fehler bei "alten" Callbacks? –

Antwort

1

Sie Ihre Modellklassen nach Ihrer json schreiben müssen response.So in diesem Fall sollten Sie Ihre „Pokemon“ Klasse in ändern:

public class Data { 

    @SerializedName("count") 
    private Integer count; 
    @SerializedName("previous") 
    private Object previous; 
    @SerializedName("results") 
    private List<Pokemon> results = null; 
    @SerializedName("next") 
    private String next; 

    public Integer getCount() { 
     return count; 
    } 

    public void setCount(Integer count) { 
     this.count = count; 
    } 

    public Object getPrevious() { 
     return previous; 
    } 

    public void setPrevious(Object previous) { 
     this.previous = previous; 
    } 

    public List<Pokemon> getResults() { 
     return results; 
    } 

    public void setResults(List<Pokemon> results) { 
     this.results = results; 
    } 

    public String getNext() { 
     return next; 
    } 

    public void setNext(String next) { 
     this.next = next; 
    } 


    public class Pokemon { 

     @SerializedName("url") 
     private String url; 
     @SerializedName("name") 
     private String name; 

     public String getUrl() { 
      return url; 
     } 

     public void setUrl(String url) { 
      this.url = url; 
     } 

     public String getName() { 
      return name; 
     } 

      public void setName(String name) { 
      this.name = name; 
     } 

    } 

} 

Und Sie api Schnittstelle:

public interface Pokeapi { 

    String URL = "https://pokeapi.co/api/v2/"; 

    @GET("pokemon") 
    Call<Data> getPokemonNameAndPic(); 

} 

Aktualisieren Sie Ihre mainActivity als:

public class MainActivity extends AppCompatActivity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final ListView listView = (ListView) findViewById(R.id.listView); 

    Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(Pokeapi.URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    Pokeapi pokeapi = retrofit.create(Pokeapi.class); 


    Call<Data> call = pokeapi.getPokemonNameAndPic(); 

    call.enqueue(new Callback<Data>() { 
     @Override 
     public void onResponse(Call<Data> call, Response<Data> response) { 
      Log.d("response", response.body().toString()); 
      Data data = response.body(); 

       String[] pokemonNames = new String[data.getResults().size()]; 

       for (int i = 0; i < data.getResults().size(); i++) { 

        pokemonNames[i] = data.getResults().get(i).getName(); 
       } 
       for (String item : pokemonNames){ 
        Log.d("item", item); 
       } 
       listView.setAdapter(
         new ArrayAdapter<String>(
           getApplicationContext(), 
           android.R.layout.simple_list_item_1, 
           pokemonNames 
         ) 
       ); 

      } 


     @Override 
     public void onFailure(Call<Data> call, Throwable t) { 
      Toast.makeText(getApplicationContext(), t.getMessage(), Toast.LENGTH_SHORT).show(); 
     } 
    }); 

} 

}

0

Ihre GET Anfrage Sie ein JSON-Objekt als Antwort gibt kein Array noch eine Liste. Nun schauen die Antwort wie folgt aus:

{ 
"count": 949, 
"previous": null, 
"results": [ 
{ 
"url": "https://pokeapi.co/api/v2/pokemon/1/", 
"name": "bulbasaur" 
}, 
{ 
"url": "https://pokeapi.co/api/v2/pokemon/13/", 
"name": "weedle" 
}, 
{ 
"url": "https://pokeapi.co/api/v2/pokemon/20/", 
"name": "raticate" 
} 
], 
"next": "https://pokeapi.co/api/v2/pokemon/?limit=20&offset=20" 
} 

Sie nicht List<Pokemon> als Antwort bekommen kann direkt, weil die gewünschte Liste unter "results" Tag der Antwort ist. Sie müssen also dafür eine andere POJO-Klasse anlegen. Verwenden Sie JSON to POJO-Konverter, um eine Pojo-Klasse aus JSON zu erstellen. In diesem Fall habe ich http://www.jsonschema2pojo.org/ verwendet, um POJO-Klassen zu erstellen, die so aussehen.

-----------------------------------com.example.Example.java----------------------------------- 

package com.example; 

import java.util.List; 
import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Example { 

@SerializedName("count") 
@Expose 
private Integer count; 
@SerializedName("previous") 
@Expose 
private Object previous; 
@SerializedName("results") 
@Expose 
private List<Result> results = null; 
@SerializedName("next") 
@Expose 
private String next; 

public Integer getCount() { 
return count; 
} 

public void setCount(Integer count) { 
this.count = count; 
} 

public Object getPrevious() { 
return previous; 
} 

public void setPrevious(Object previous) { 
this.previous = previous; 
} 

public List<Result> getResults() { 
return results; 
} 

public void setResults(List<Result> results) { 
this.results = results; 
} 

public String getNext() { 
return next; 
} 

public void setNext(String next) { 
this.next = next; 
} 

} 
-----------------------------------com.example.Result.java----------------------------------- 

package com.example; 

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

public class Result { 

@SerializedName("url") 
@Expose 
private String url; 
@SerializedName("name") 
@Expose 
private String name; 

public String getUrl() { 
return url; 
} 

public void setUrl(String url) { 
this.url = url; 
} 

public String getName() { 
return name; 
} 

public void setName(String name) { 
this.name = name; 
} 

} 

So Ihre Antwort sollte wie folgt behandelt werden:

call.enqueue(new Callback<Example>() { 
      @Override 
      public void onResponse(Call<Example> call, Response<Example> response) { 
       List<Result > pokemon = response.body().getResults(); 

        String[] pokemonNames = new String[pokemon.size()]; 

        for (int i = 0; i < pokemon.size(); i++) { 

         pokemonNames[i] = pokemon.get(i).getName(); 
        } 
        listView.setAdapter(
          new ArrayAdapter<String>(
            getApplicationContext(), 
            android.R.layout.simple_list_item_1, 
            pokemonNames 
          ) 
        ); 

       } 
Verwandte Themen