Я пытаюсь научиться использовать REST API в Android Studio. Я новичок в разработке Android в целом, и это будет только второй раз, когда я использую REST API. Я попытался выполнить несколько руководств на YouTube, но у меня все еще есть проблемы, и я чувствую, что решение будет очень простым, и я буду чувствовать себя очень глупо, особенно с учетом того, что я использую RetroFit ... Я просто хочу видеть имена покемонов, отображаемые в виде списка (по крайней мере, пока).

Вот мои файлы кода

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

Любая помощь приветствуется! Спасибо :)

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

0
Shane Porter 31 Дек 2017 в 08:30

2 ответа

Лучший ответ

Вы должны написать свои классы моделей в соответствии с вашим json-ответом. Поэтому в этом случае вы должны изменить свой класс «Pokemon» на:

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

    }

}

И у вас интерфейс api как:

public interface Pokeapi {

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

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

}

Обновите mainActivity как:

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();
        }
    });

}

}

1
Sonu Sanjeev 31 Дек 2017 в 07:36

Ваш запрос GET дает вам объект JSON в качестве ответа, а не массив или список . Теперь ответ выглядит так:

{
"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"
}

Вы не можете получить List<Pokemon> в качестве ответа напрямую, потому что желаемый список находится под тегом "results" ответа. Поэтому для этого вам нужно создать разные классы POJO. Используйте преобразователи JSON в POJO для создания класса pojo из JSON. В этом случае я использовал http://www.jsonschema2pojo.org/, чтобы сделать классы POJO, которые выглядят следующим образом .

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

}

Итак, ваш ответ должен быть обработан следующим образом:

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
                            )
                    );

                }
0
WS Ayan 31 Дек 2017 в 06:58