问题描述:使用volley正常获取到了和后台数据,但是第一次进入时,数据不显示到ArrayList中,再次进入才显示数据。
原因:
使用debug模式调试发现setAdapter()写在了外部类中,代码执行时,先执行了内部类的部分,再执行外部类的setAdapter();
由于是先执行内部类的部分,所以第一次运行时,内部类添加的数据为空,只有在第一次执行完代码后,即内部类代码,外部类代码都执行完毕,第二次进入执行内部类的添加数据方法时,数据才不为空,才会显示数据;
代码如下:把这两行代码放入volley请求成功的回调函数中执行,这两行代码的作用是把实体类的数据传入目标列表;
PlayerAdapter adapter = new PlayerAdapter(playerList); recyclerView.setAdapter(adapter);
完整代码如下:
//请求接口 String url = "http://www.gdsanhe.cn/gzkp/index.php?d=api&c=Player"; VolleyRequestUtil.RequestGet(getActivity().getApplicationContext(), url, "listGet", new VolleyListenerInterface(getActivity().getApplicationContext(), VolleyListenerInterface.mListener, VolleyListenerInterface.mErrorListener) { // Volley请求成功时调用的函数 @Override public void onMySuccess(String response) { // Toast.makeText(getActivity().getApplicationContext(), response, Toast.LENGTH_SHORT).show(); JSONObject obj = JSONObject.parseObject(response); JSONArray transitListArray = obj.getJSONArray("dataarray"); for (int i = 0; i < transitListArray.size(); i++) { JSONObject tempObject = JSONObject.parseObject(transitListArray.getString(i)); // Toast.makeText(getActivity().getApplicationContext(),"Array:" + transitListArray.getString(i) + " ",Toast.LENGTH_SHORT).show(); Player _player = new Player(tempObject.getString("name"), "NO."+tempObject.getString("id")); playerList.add(_player); PlayerAdapter adapter = new PlayerAdapter(playerList); recyclerView.setAdapter(adapter); // Toast.makeText(getActivity().getApplicationContext(), playerList.toString(), Toast.LENGTH_SHORT).show(); } } // Volley请求失败时调用的函数 @Override public void onMyError(VolleyError error) { Toast.makeText(getActivity().getApplicationContext(), "网络请求出错!", Toast.LENGTH_SHORT).show(); } }, false);
动态加载跟静态加载不一样,如果是静态加载,可以把数据加载放在匿名内部类的外面,因为他不需要请求网络,可以直接显示在指定的listview上。
这个算是一个坑吧,没思路的话真的会搞死人,填一下0.0。