Fragment中RecyclerView无法加载JSON数据问题求助
问题:Fragment中RecyclerView无法加载Volley获取的JSON数据
本地构造用户数据时RecyclerView能正常显示,但通过Volley获取并解析JSON数据时,仅显示RecyclerView的空布局,无法加载数据内容。更换多个JSON接口测试仍无法获取数据,怀疑问题出在JSON解析环节。
相关代码
Fragment代码(ListaTrabajadores.java)
public class ListaTrabajadores extends Fragment { ArrayList<Usuario> listaFragment; RecyclerView recycle; private adaptador myadapter; private RequestQueue queu; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View vista = inflater.inflate(R.layout.fragment_lista_trabajadores, container, false); recycle = vista.findViewById(R.id.recyclerview); recycle.setLayoutManager(new LinearLayoutManager(getContext())); listaFragment = new ArrayList<>(); queu = Volley.newRequestQueue(getContext()); llenarlista(); return vista; } private void llenarlista() { String url = "https://pixabay.com/api/?key=myApiKey&q=kitten&image_type=photo&pretty=true"; JsonObjectRequest jsonArrayRequest = new JsonObjectRequest(Request.Method.GET, url,null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { try { JSONArray jsonArray= response.getJSONArray("hits"); for (int i = 0; i < jsonArray.length(); i++) { JSONObject object = jsonArray.getJSONObject(i); String imagen=object.getString("pageURL"); String nombre= object.getString("user"); String puesto =object.getString("tags"); String apellido = object.getString("user"); listaFragment.add(new Usuario(nombre,apellido,puesto,imagen)); } myadapter = new adaptador(getContext(), listaFragment); recycle.setAdapter(myadapter); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { public void onErrorResponse (VolleyError error) { Log.d("tag", "onErrorResponse" + error.getMessage()); } }); queu.add(jsonArrayRequest); } }
MainActivity代码(MainActivity.java)
public class MainActivity extends AppCompatActivity { ArrayList<Usuario> listaActividad; RecyclerView recycle; ListaTrabajadores fragmentolista = new ListaTrabajadores(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ponerFragmento(fragmentolista); } private void ponerFragmento(Fragment fragmento){ FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.contenedor, fragmento); fragmentTransaction.commit(); } }
排查与解决建议
- 替换真实API Key:你使用的Pixabay接口中
key=myApiKey是占位符,必须替换为在Pixabay官网申请的真实API Key,否则接口会返回权限错误。 - 添加网络权限:确保
AndroidManifest.xml中已添加网络权限:
缺少该权限时,Volley无法发起网络请求,自然无法获取数据。<uses-permission android:name="android.permission.INTERNET"/> - 优化异常日志:当前JSONException仅打印栈信息,建议添加Log输出具体错误细节,快速定位问题字段:
catch (JSONException e) { Log.e("JSON_ERROR", "解析失败:" + e.getMessage()); e.printStackTrace(); } - 核对JSON字段拼写:确认Pixabay返回的JSON结构中,
pageURL、user、tags等字段拼写完全正确(注意大小写)。 - 使用安全上下文:将
getContext()替换为requireContext(),避免Fragment生命周期中上下文为空的情况,保证Adapter初始化时上下文有效。 - 调试请求状态:在
onResponse和onErrorResponse中添加Log,确认请求是否成功触发回调:
如果未输出该Log,说明请求未成功发起或未收到响应。@Override public void onResponse(JSONObject response) { Log.d("VOLLEY_SUCCESS", "请求成功,返回数据:" + response.toString()); // 原有解析代码 }
内容的提问来源于stack exchange,提问作者Rese
相关产品推荐
相关产品推荐

