无法从另一个类获取ArrayList。它总是空的

问题描述 投票:0回答:1

我仍然是Android的初学者,还是Stackowerflow的新手,希望您能理解我的问题。我正在使用Volley libary和Singleton类。我有JsonParser类,该类在解析后应返回对象的填充列表。

public class JsonParse {

Context context;
public ArrayList<ParseItem> parseItemList = new ArrayList<>();
String json_url = "myurl";

public JsonParse(Context context) {
    this.context = context;

}

public ArrayList<ParseItem> getList() {

    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, json_url, null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {


                    for (int i = 0; i < response.length(); i++) {


                        try {
                            JSONObject jsonObject = response.getJSONObject(i);
                            ParseItem parseItem = new ParseItem();


                            String naslov = jsonObject.getString("naslov");
                            String url = jsonObject.getString("url");

                            parseItem.setTitle(naslov);
                            parseItem.setUrl(url);

                            JSONArray niz = jsonObject.getJSONArray("niz");



                            ArrayList<String> podnaslovTMP = new ArrayList<>();
                            ArrayList<String> podurlTMP = new ArrayList<>();
                            for (int j = 0; j < niz.length(); j++) {

                                JSONObject nizOBJ = niz.getJSONObject(j);
                                String podnaslov = nizOBJ.getString("podnaslov");
                                String podurl = nizOBJ.getString("podurl");

                                podnaslovTMP.add(podnaslov);
                                podurlTMP.add(podurl);


                            }

                            parseItemList.add(parseItem);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }


                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            error.printStackTrace();
        }
    });


    MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);

    return parseItemList;
}}

然后我试图调用getList并在HomeFragment中获取我的列表。

public class HomeFragment extends Fragment implements View.OnClickListener {


private Context context;
private static final int REQUEST_CALL = 1;
private View view;
private ParseItem parseItem = new ParseItem();
public ArrayList<ParseItem>arrayList = new ArrayList<>();

public HomeFragment() {
}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_home, container, false);
    init();

    JsonParse jsonParse = new JsonParse(getActivity());
    arrayList = jsonParse.getList();


    return view;
}

我的arrayList始终为空。我希望有人能帮助我。

java android json android-volley
1个回答
0
投票

创建列表器

public interface GetArrayListListner{
   void getArrayData(ArrayList<ParseItem>);
}

   public class JsonParse {
   private GetArrayListListner arrayListListner;// add this line
   Context context;
   public ArrayList<ParseItem> parseItemList = new ArrayList<>();
   String json_url = "myurl";

   public JsonParse(Context context,GetArrayListListner arrayListListner) {
    this.context = context;
    this.arrayListListner = arrayListListner; //Add this line

 }
 public void getList() {

   new JsonArrayRequest(Request.Method.POST, json_url, null,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {


                for (int i = 0; i < response.length(); i++) {


                    try {
                        JSONObject jsonObject = response.getJSONObject(i);
                        ParseItem parseItem = new ParseItem();


                        String naslov = jsonObject.getString("naslov");
                        String url = jsonObject.getString("url");

                        parseItem.setTitle(naslov);
                        parseItem.setUrl(url);

                        JSONArray niz = jsonObject.getJSONArray("niz");



                        ArrayList<String> podnaslovTMP = new ArrayList<>();
                        ArrayList<String> podurlTMP = new ArrayList<>();
                        for (int j = 0; j < niz.length(); j++) {

                            JSONObject nizOBJ = niz.getJSONObject(j);
                            String podnaslov = nizOBJ.getString("podnaslov");
                            String podurl = nizOBJ.getString("podurl");

                            podnaslovTMP.add(podnaslov);
                            podurlTMP.add(podurl);


                        }

                        parseItemList.add(parseItem);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
              arrayListListner.getArrayData(parseItemList);//add this line

            }
        }, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        error.printStackTrace();
    }
});


MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);

return parseItemList;
 }
}

并称呼它

JsonParse jsonParse = new JsonParse(getActivity(),new GetArrayListListner(){
  @Overrid void getArrayData(ArrayList<ParseItem>){
        arrayList = jsonParse.getList();
   }

  });

0
投票

您的方法getList()调用Web服务,该服务在单独的线程上执行。使用MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);时您将请求放置到队列中,这意味着它不会立即执行,但是您已经在返回数组。由于请求尚未执行,因此您的数组列表尚未填写。

[Google今天建议的做法是使用LiveData,对初学者来说可能很难,但是只要稍作研究,就可以解决。

https://developer.android.com/topic/libraries/architecture/livedata

也许您也可以看一下响应式编程。

另一个简单的解决方案是使用接口,因此您可以将接口作为参数传递,该参数将在数组被填充时触发。

让我知道我是否有帮助,谢谢

© www.soinside.com 2019 - 2024. All rights reserved.