Android 为什么ArrayAdapter在活动重新启动后无法更新listview?

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不再填充

我有一个在onCreate()中执行以下操作的活动:

  • 创建一个空的ArrayList
  • 创建与上述ArrayList关联的新ArrayAdapter
  • 将ListView设置为使用上述ArrayAdapter
  • 使用Volley向MyAPI发送GET请求,获取一些JSON数据以加载到ListView中
  • 获取数据后,我将其添加到ArrayList中,并按预期填充ListView

    我的问题是,当活动重新启动时(即通过模拟器旋转屏幕或通过Android Studio重新启动活动),ListView不再填充

    我没有拯救任何州。我希望活动返回其初始默认状态,因此我认为onSaveInstanceState()不是答案

    我已经验证了数据是从API成功返回的,并且适配器的哈希代码在截取请求前后是相同的,并且它等于ListView的set适配器。我还验证了在重新启动活动时调用onDestroy()和onCreate(),因此我知道它正在经历一个完整的生命周期

    如果使用setRequestedOrientation()以编程方式旋转屏幕,则不会遇到此问题。如果在GET请求回调之外将项目添加到ArrayList中,则不会遇到此问题

    以下是我的活动onCreate()

    @覆盖
    创建时受保护的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);