首页 > 解决方案 > 用程序加载后列表为空

问题描述

我是android开发的初学者。我使用 volley 库进行 HTTP 连接该程序应该将数据从服务器加载到一个名为的列表中listItems,并将其推送到 recyclerview。该程序工作正常,但我无法访问程序之外的列表值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);
    }

我在谷歌上读到匿名类可以更改属性,但更改不在它之外维护。有什么解决办法吗?

标签: androidandroid-volley

解决方案


字符串请求在后台线程中执行。它在您尝试检查列表大小后完成,因此列表为空。您将在onResponse()回调中填写列表。


推荐阅读