Android 为什么ArrayAdapter在活动重新启动后无法更新listview?
我有一个在onCreate()中执行以下操作的活动:Android 为什么ArrayAdapter在活动重新启动后无法更新listview?,android,listview,arraylist,android-arrayadapter,android-volley,Android,Listview,Arraylist,Android Arrayadapter,Android Volley,我有一个在onCreate()中执行以下操作的活动: 创建一个空的ArrayList 创建与上述ArrayList关联的新ArrayAdapter 将ListView设置为使用上述ArrayAdapter 使用Volley向MyAPI发送GET请求,获取一些JSON数据以加载到ListView中 获取数据后,我将其添加到ArrayList中,并按预期填充ListView 我的问题是,当活动重新启动时(即通过模拟器旋转屏幕或通过Android Studio重新启动活动),ListView不再填充
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_测试);
//要显示的数据
descriptions=newarraylist();
listView=(listView)this.findViewById(R.id.myListView);
//将“说明”链接到适配器
adapter=new ArrayAdapter(此,R.layout.list\u json\u text\u视图,描述);
setAdapter(适配器);
这个.addTextFilter();
这个.addListViewClickListener();
//请参见下面我的ApiGetRequest类
请求=新的ApiGetRequest();
request.send(this.getContext(),getDataUrl(),this,“,request_TYPES.TEXT);
}
以及我的活动获取请求回调
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
}
}
public void onSuccess(DescriptiveJSONArray项,请求类型){
descriptions.clear();
试一试{
对于(int i=0;i
还有我的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);
}
}
}
//我的活动实现ApiGetCallback
public void send(上下文上下文、字符串url、ApiGetCallback回调、字符串标记、请求类型){
StringRequest StringRequest=getStringRequest(url、回调、标记、类型);
//RequestQueue的单例包装器
AppRequestQueue=AppRequestQueue.getInstance(上下文);
添加(stringRequest);
}
//ApiGetCallback中的内部类
类SuccessListener实现响应。Listener{
ApiGetCallback;
请求类型;
public SuccessListener(ApiGetCallback回调,请求类型){
this.callback=回调;
this.type=type;
}
@凌驾
公共void onResponse(字符串响应){
试一试{
DescriptiveJSONArray jsonResp=新的DescriptiveJSONArray(响应);
onSuccess(jsonResp,type);
}
捕获(JSONException e){
callback.onJsonException(e);
}
}
}
知道发生了什么事吗?。我正在测试棉花糖和牛轧糖,在onSuccess函数完成后,您缺少对notifyDataSetChanged的调用。
adapter=newArrayAdapter(这个,R.layout.list\u json\u text\u视图,描述);
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);
setAdapter(适配器);
//请参见下面我的ApiGetRequest类
请求=新的ApiGetRequest();
request.send(this.getContext(),getDataUrl(),this,“,request_TYPES.TEXT);
在onResume方法中使用这部分代码。您可能需要重写onStart并更新其中的任何内容尝试使用适配器的clear和add方法,而不是list@cricket_007我试过了,但没有成功。还尝试了
notifiedDataSetChanged
Hmm。我不明白为什么这样做不起作用。遵循您正在进行的回调流有些困难。例如,我没有看到创建一个SuccessListener
。对于要调用的onSuccess方法,您的活动实现了什么接口?为什么你甚至需要延长截击的反应。听众?谢谢你的建议。我应该提到,我尝试了这个方法,但没有成功。在onresume方法中调用api。并在onresume方法中设置适配器。谢谢。这似乎有效,但我不明白为什么。当活动重新启动时调用onCreate(),那么为什么上面的代码还不够?因为当打开应用程序时,只有第一次调用onCreate。重新启动此活动时,请调用onresume.second time仅调用onresume方法。
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);