Почему мне нужно было использовать notifyDataSetChanged (), когда я инстанцировал свой адаптер после загрузки в свою модель? - PullRequest
0 голосов
/ 14 апреля 2020

Цель: импортировать 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);
    }
}
...