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

时间:2016-08-31 03:53:15

标签: android listview arraylist android-arrayadapter android-volley

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

  1. 创建一个空的ArrayList
  2. 创建与上述ArrayList
  3. 关联的新ArrayAdapter
  4. 将ListView设置为使用上述ArrayAdapter
  5. 使用Volley向我的API发送GET请求以获取一些JSON数据以加载到ListView中
  6. 获取数据后,我将其添加到我的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上进行测试

3 个答案:

答案 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方法中使用这部分代码。