[英]Cant get ArrayList from another class. Its always empty
我仍然是 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總是空的。 我希望有一個人可以幫助我。
創建監聽器
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();
}
});
您的方法 getList() 調用 Web 服務,該服務在單獨的線程上執行。 當你使用MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest);
您將請求放入隊列,這意味着它現在不會被執行,但您已經在返回您的數組。 由於請求尚未執行,您的數組列表尚未填充。
今天Google推薦的做法是使用LiveData,對於初學者來說可能有點難,但只要稍微研究一下,就可以解決。
https://developer.android.com/topic/libraries/architecture/livedata
也許你也可以看看反應式編程。
另一個簡單的解決方案是使用接口,因此您可以將接口作為參數傳遞,該參數將在您的數組被填充時觸發。
如果對我有幫助,請告訴我,謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.