Не удается получить данные из API в ArrayList с залпом в Android - PullRequest
0 голосов
/ 02 августа 2020

Я хочу показать свои данные в RecyclerView, но не могу добавить элемент из API в ArrayList. Массив пуст

Это мой код:

ArrayList<SanPham> sanPhams;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        sanPhams = new ArrayList<>();
        RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
        JsonArrayRequest jsonArrayRequest =  new JsonArrayRequest(getApplicationContext().getString(R.string.URL), new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject jsonObject = response.getJSONObject(i);

                        SanPham sanPham = new SanPham();

                        sanPham.setMaSanPham(jsonObject.getString("maSanPham"));
                        sanPham.setTenSanPham(jsonObject.getString("tenSanPham"));
                        sanPham.setHinhAnh(jsonObject.getString("hinhAnh"));
                        sanPham.setGiaBan(jsonObject.getInt("giaBan"));
                        sanPham.setThongSoKyThuat(jsonObject.getString("thongSoKyThuat"));
                        sanPham.setMoTa(jsonObject.getString("moTa"));
                        sanPhams.add(sanPham);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
                Toast.makeText(getApplicationContext(), String.valueOf(sanPhams.size()), Toast.LENGTH_SHORT).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("Volley", error.toString());
            }
        });
        queue.add(jsonArrayRequest);
        Toast.makeText(MainActivity.this, String.valueOf(sanPhams.size()), Toast.LENGTH_SHORT).show();
}

Когда я всплываю размер всплывающего окна onResponse Размер массива равно 4 (в моих данных 4 элемента), но внешний размер тоста равен 0. Я пытался исправить это, но массив все еще пуст.

1 Ответ

0 голосов
/ 02 августа 2020

Сетевой ответ зависит от времени. Когда вы вызываете тост снаружи, у него до сих пор нет данных. Но внутри метода успеха есть данные. Потому что этот метод вызывается после получения данных. Если вы хотите работать с данными после получения с сервера, вы можете использовать интерфейс Java.

В вашем случае что-то вроде:

public interface ResponseListener{
  void onResponseReceived(ArrayList<SanPham> sanPhams);
}

В вашем классе:

ArrayList<SanPham> sanPhams;
ResponseListener listener;

затем внутри метода onResponse:

for (int i = 0; i < response.length(); i++) {
    try {
       JSONObject jsonObject = response.getJSONObject(i);

       SanPham sanPham = new SanPham();

       sanPham.setMaSanPham(jsonObject.getString("maSanPham"));
       sanPham.setTenSanPham(jsonObject.getString("tenSanPham"));
       sanPham.setHinhAnh(jsonObject.getString("hinhAnh"));
       sanPham.setGiaBan(jsonObject.getInt("giaBan"));
       sanPham.setThongSoKyThuat(jsonObject.getString("thongSoKyThuat"));
       sanPham.setMoTa(jsonObject.getString("moTa"));
       sanPhams.add(sanPham);
    } catch (JSONException e) {
            e.printStackTrace();
    }
}
Toast.makeText(getApplicationContext(), String.valueOf(sanPhams.size()), Toast.LENGTH_SHORT).show();
listener.onResponseReceived(sanPhams);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...