Цель: импортировать JSON, используя залп и настройку представления рециркулятора, чтобы отобразить длинный список покемонов, которые я проанализировал из JSON (я делаю покедекса).
Краткое описание кода: пользовательский адаптер (называемый PokemonAdapter), но он действительно выполняет обычные функции адаптера; он просто указывает, как надуть новое представление и какой текст установить. Моя основная деятельность - это то, где у меня были проблемы. В onCreate я сначала загрузил свой JSON набор данных, , а затем установил объект адаптера в новый PokemonAdapter. Мой код скомпилирован, не выдает ошибок во время выполнения, но также не выдает список. Именно тогда я узнал о методе notifyDataSetChanged () . Я не понимал, почему это будет иметь значение, но я также не понимал, почему это будет больно, поэтому я попробовал это, и это сработало.
Я немного растерялся. Мне было интересно, может ли кто-нибудь объяснить, почему мне нужно обновить адаптер, даже если я установил адаптер после загрузки своих данных. Это потому, что я изначально объявляю адаптер выше использования метода загрузки? Я новичок в OOP, поэтому я немного запутался с декларацией и созданием экземпляра.
public class MainActivity extends AppCompatActivity {
private List<Pokemon> pokemonDB = new ArrayList<>();
private RequestQueue queue;
/** RECYCLER VIEW */
/* Obtain handles for Recycler View components*/
private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager layoutManager;
/** METHODS */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
loadPokemon();
/* Setting up the Recycler View*/
// Link it to XML doc to inflate recycler object
recyclerView = findViewById(R.id.recycler_view);
// initialize layout manager and use setter method
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
// Initialize a new adapter using the PokemonAdapter class and use setter method
adapter = new PokemonAdapter(pokemonDB);
recyclerView.setAdapter(adapter);
}
/* Load JSON from Poke API using volley protocol */
public void loadPokemon() {
//Instantiate the RequestQueue
queue = Volley.newRequestQueue(this);
String url = "https://pokeapi.co/api/v2/pokemon/?limit=151";
// request a JSON response from the provided URL
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonResultsArray = response.getJSONArray("results");
for (int i = 0; i < jsonResultsArray.length(); i++) {
JSONObject pokemonResult = jsonResultsArray.getJSONObject(i);
String pokemonName = pokemonResult.getString("name");
String pokemonUrl = pokemonResult.getString("url");
// Now, add this data to a pokemon object in the pokemonDB array list
pokemonDB.add(new Pokemon(pokemonName, pokemonUrl));
}
//this notifies the adapter that the data has changed
adapter.notifyDataSetChanged();
}
catch (JSONException e) {
Log.e("cs50", "Error parsing JSON pokedex objects.");
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("cs50", "error retrieving JSON pokedex database.");
}
}
);
// Add the request to the queue
queue.add(jsonObjectRequest);
}
}