Список пуст после загрузки с процедурой - PullRequest
0 голосов
/ 28 сентября 2019

Я новичок в разработке Android.Я использовал библиотеку залпов для HTTP-соединений. Предполагается, что программа загружает данные с сервера в список с именем listItems и отправляет их в окно просмотра.Программа работает нормально, но я не могу получить доступ к значениям списка вне процедуры loadRecyclerView Это код:

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkError;
import com.android.volley.NoConnectionError;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.ServerError;
import com.android.volley.TimeoutError;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;
    private ArrayList<ListItem> listItems;
    private TextView dateTextView;

    private static final String URL_DATA = "http://10.0.2.2:8080/json/csv.php";

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

        dateTextView = (TextView) findViewById(R.id.Date);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");

        dateTextView.setText("Date:" + simpleDateFormat.format(new Date()));


        recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
        recyclerView.hasFixedSize();
        recyclerView.setLayoutManager(new LinearLayoutManager(this));

        listItems = new ArrayList<>();


        loadRecyclerView();
        // I want to access values of the list right here

        Log.i("list", "onCreate: "+this.listItems.size());

    }

    private void loadRecyclerView() {

        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setMessage("Chargement...");
        progressDialog.show();


        StringRequest stringRequest = new StringRequest(
                Request.Method.GET,
                URL_DATA,
                // this is an anonymous class, make it a public class and instantiate from it
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

                        progressDialog.dismiss();

                        try {

                            JSONArray jsonArray = new JSONArray(response);

                            for (int i = 0; i < jsonArray.length(); i++) {
                                JSONObject object = jsonArray.getJSONObject(i);

                                String salle = object.getString("salle");
                                String matiere = object.getString("matiere");

                                String groupe = object.getString("groupe");
                                String nomEnseignant = object.getString("nomEnseignant");

                                String typeSeance = "";//object.getString("typeSeance");
                                String seance = ""; //object.getString("seance");
                                String regime = "";//object.getString("regime");

                                ListItem listItem = new ListItem(matiere,typeSeance, groupe, salle, nomEnseignant,regime,"",seance,simpleDateFormat.format(new Date()));
                                listItems.add(listItem);
                            }

                            adapter = new RecyclerViewAdapter(listItems, getApplicationContext());
                            recyclerView.setAdapter(adapter);
                            Log.i("list", "onResponse: "+listItems.size());

                        } catch (JSONException e) {
                            Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
                        }
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                        progressDialog.dismiss();
                        if (error instanceof NetworkError) {

                            Toast.makeText(getApplicationContext(),"Cannot connect to Internet...Please check your connection!",Toast.LENGTH_SHORT).show();

                        }
                        else if (error instanceof ServerError) {

                            Toast.makeText(getApplicationContext(),"The server could not be found. Please try again after some time!!",Toast.LENGTH_SHORT).show();

                        } else if (error instanceof AuthFailureError) {

                            Toast.makeText(getApplicationContext(),"AuthFailureError",Toast.LENGTH_SHORT).show();

                        } else if (error instanceof ParseError) {

                            Toast.makeText(getApplicationContext(),"Parsing error! Please try again after some time!!",Toast.LENGTH_SHORT).show();

                        } else if (error instanceof NoConnectionError) {

                            Toast.makeText(getApplicationContext(),"NoConnectionError",Toast.LENGTH_SHORT).show();

                        } else if (error instanceof TimeoutError) {

                            Toast.makeText(getApplicationContext(),"Connection TimeOut! Please check your internet connection.",Toast.LENGTH_SHORT).show();

                        }

                    }
                }
        );
        Log.i("list", "size: "+listItems.size());
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

Я прочитал в Google, что анонимный класс может изменять атрибуты, но изменение не поддерживаетсявне этого.Любое решение?

1 Ответ

0 голосов
/ 28 сентября 2019

Строковый запрос выполняется в фоновом потоке.Он заканчивается после вашей попытки проверить размер списка, поэтому список еще пуст.Вы заполните список в onResponse() обратном вызове.

...