Android 函数没有 return 完整的 ArrayList
Android function doesn't return full ArrayList
所以我正在尝试将一些数据放入列表视图中。
我正在调用函数 jsonParse() 来填充我的 ArrayList,它由我的 arrayAdapter 使用。
但是当我 运行 我的应用程序时,列表视图未填充。
我可以在调试模式下看到数组列表 'steden' 确实填充了来自我的 url 的数据。
但是,当它returns arraylist 时,它是空的。
我怎样才能确保它不会自行清空?
package com.example.taxifooi;
import android.content.Intent;
import android.os.Bundle;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Locatie extends AppCompatActivity {
private RequestQueue mQueue;
private String naam;
private String coord;
private String stad;
private FloatingActionButton fab;
ArrayList<String> arrayList = new ArrayList<String>();
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locatie);
listview = (ListView) findViewById(R.id.listview);
fab = findViewById(R.id.locationFab);
mQueue = Volley.newRequestQueue(this);
jsonParse();
arrayList.add("Ootmarsum");
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Locatie.this, newLocation.class);
Locatie.this.startActivity(intent);
}
});
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList);
listview.setAdapter(arrayAdapter);
arrayAdapter.add(jsonParse());
}
public ArrayList<String> jsonParse() {
final ArrayList<String> steden = new ArrayList<String>();
String url = "https://android.frielinck.net/?format=json";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject employee = jsonArray.getJSONObject(i);
String city = employee.getString("city");
steden.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(request);
return (steden);
}
}
当你调用 jsonParse()
时,它会在后台线程上调用,你的主线程会去 运行 下一行,它不会等待 jsonParse()
的响应。
并且作为您的代码,它会将 arrayList(尚未填充,因为后台线程尚未完成)传递给适配器。
适配器获得列表后,您的后台线程可能会完成并return列出并将其添加到 arrayList,但这不会影响已创建的适配器。
Check this answer for more
在一点帮助下弄明白了。
- 把jsonParse改成这样,然后调用updateLV();在 for 循环的末尾。
private void jsonParse() {
final ArrayList<String> steden = new ArrayList<String>();
String url = "https://android.frielinck.net/?format=json";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject employee = jsonArray.getJSONObject(i);
String city = employee.getString("city");
arrayList.add(city);
}
updateLV();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(request);
}
- 添加一个名为 updateLV() 的新函数;
private void updateLV(){
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList);
listview.setAdapter(arrayAdapter);
}
所以我正在尝试将一些数据放入列表视图中。 我正在调用函数 jsonParse() 来填充我的 ArrayList,它由我的 arrayAdapter 使用。 但是当我 运行 我的应用程序时,列表视图未填充。
我可以在调试模式下看到数组列表 'steden' 确实填充了来自我的 url 的数据。 但是,当它returns arraylist 时,它是空的。 我怎样才能确保它不会自行清空?
package com.example.taxifooi;
import android.content.Intent;
import android.os.Bundle;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class Locatie extends AppCompatActivity {
private RequestQueue mQueue;
private String naam;
private String coord;
private String stad;
private FloatingActionButton fab;
ArrayList<String> arrayList = new ArrayList<String>();
ListView listview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_locatie);
listview = (ListView) findViewById(R.id.listview);
fab = findViewById(R.id.locationFab);
mQueue = Volley.newRequestQueue(this);
jsonParse();
arrayList.add("Ootmarsum");
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(Locatie.this, newLocation.class);
Locatie.this.startActivity(intent);
}
});
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList);
listview.setAdapter(arrayAdapter);
arrayAdapter.add(jsonParse());
}
public ArrayList<String> jsonParse() {
final ArrayList<String> steden = new ArrayList<String>();
String url = "https://android.frielinck.net/?format=json";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject employee = jsonArray.getJSONObject(i);
String city = employee.getString("city");
steden.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(request);
return (steden);
}
}
当你调用 jsonParse()
时,它会在后台线程上调用,你的主线程会去 运行 下一行,它不会等待 jsonParse()
的响应。
并且作为您的代码,它会将 arrayList(尚未填充,因为后台线程尚未完成)传递给适配器。
适配器获得列表后,您的后台线程可能会完成并return列出并将其添加到 arrayList,但这不会影响已创建的适配器。
Check this answer for more
在一点帮助下弄明白了。
- 把jsonParse改成这样,然后调用updateLV();在 for 循环的末尾。
private void jsonParse() {
final ArrayList<String> steden = new ArrayList<String>();
String url = "https://android.frielinck.net/?format=json";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray jsonArray = response.getJSONArray("data");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject employee = jsonArray.getJSONObject(i);
String city = employee.getString("city");
arrayList.add(city);
}
updateLV();
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
mQueue.add(request);
}
- 添加一个名为 updateLV() 的新函数;
private void updateLV(){
ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, arrayList);
listview.setAdapter(arrayAdapter);
}