我有一个活动,在onCreate()中执行以下操作:
获取数据后,我将其添加到我的ArrayList中,并按预期填充ListView
我的问题是,当重新启动活动时(即通过模拟器旋转屏幕或通过Android Studio重新启动活动),ListView不再填充。
我没有保存任何州。我希望活动恢复到初始默认状态,所以我不认为onSaveInstanceState()就是答案。
我已经验证了数据是从API成功返回的,并且适配器的哈希码在凌空请求之前和之后是相同的,并且它等于ListView的设置适配器。我还验证了重新启动活动时调用onDestroy()然后调用onCreate(),因此我知道它正在经历一个完整的生命周期。
如果我使用setRequestedOrientation()以编程方式旋转屏幕,我就不会遇到此问题。如果我在GET请求回调之外向我的ArrayList添加项目,我就不会遇到这个问题。
这是我的活动onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
//The data to be displayed
descriptions = new ArrayList<>();
listView = (ListView)this.findViewById(R.id.myListView);
//Link 'descriptions' to the adapter
adapter = new ArrayAdapter<>(this, R.layout.list_json_text_view, descriptions);
listView.setAdapter(adapter);
this.addTextFilter();
this.addListViewClickListener();
//See my ApiGetRequest class below
request = new ApiGetRequest();
request.send(this.getContext(), getDataUrl(), this, "", REQUEST_TYPES.TEXT);
}
我的活动GET请求回调
public void onSuccess(DescriptiveJSONArray items, REQUEST_TYPES type) {
descriptions.clear();
try {
for (int i = 0; i < items.length(); ++i) {
JSONObject obj = items.getJSONObject(i);
String desc = obj.optString("name", "") + " " + obj.optString("description", "");
//TODO: Remove debug code
System.out.println("Adding: "+desc);
descriptions.add(desc);
}
}
catch(JSONException e) {
e.printStackTrace();
//getJSONObject failed
}
}
我的ApiGetRequest方法
//My activity implements ApiGetCallback
public void send(Context context, String url, ApiGetCallback callback, String tag, REQUEST_TYPES type) {
StringRequest stringRequest = getStringRequest(url, callback, tag, type);
//Singleton wrapper for RequestQueue
AppRequestQueue queue = AppRequestQueue.getInstance(context);
queue.add(stringRequest);
}
//Inner class inside ApiGetCallback
class SuccessListener implements Response.Listener<String> {
ApiGetCallback callback;
REQUEST_TYPES type;
public SuccessListener(ApiGetCallback callback, REQUEST_TYPES type) {
this.callback = callback;
this.type = type;
}
@Override
public void onResponse(String response) {
try {
DescriptiveJSONArray jsonResp = new DescriptiveJSONArray(response);
callback.onSuccess(jsonResp, type);
}
catch(JSONException e) {
callback.onJsonException(e);
}
}
}
任何想法发生了什么?我在Marshmallow和Nougat上进行测试
答案 0 :(得分:1)
在onSuccess功能完成后,您错过了对notifyDataSetChanged
的调用。
答案 1 :(得分:1)
您可能需要覆盖onStart并更新其中的任何内容
答案 2 :(得分:0)
adapter = new ArrayAdapter<>(this, R.layout.list_json_text_view, descriptions);
listView.setAdapter(adapter);
//See my ApiGetRequest class below
request = new ApiGetRequest();
request.send(this.getContext(), getDataUrl(), this, "", REQUEST_TYPES.TEXT);
在onResume方法中使用这部分代码。