Fragment解析JSON时Context报错,求代码问题排查与解决
Fragment中RecyclerView上下文报错问题解决
核心问题:QuotesFragment的setupRecyclerView方法中,传入的this上下文出现红线报错:
private void setupRecyclerView(List<QuotesModel> quotesModelList) { QuotesAdapter quotesAdapter = new QuotesAdapter(this,quotesModelList); recyclerView.setLayoutManager(new LinearLayoutManager(this)); recyclerView.setAdapter(quotesAdapter); }
问题原因及修复方案
1. 上下文类型不匹配
QuotesAdapter的构造函数要求传入Context类型参数,但Fragment中的this指向的是Fragment实例,而非Context对象,这是直接报错的原因。
修复: 将this替换为requireContext()(推荐,更安全,会检查上下文是否有效)或getActivity():
private void setupRecyclerView(List<QuotesModel> quotesModelList) { QuotesAdapter quotesAdapter = new QuotesAdapter(requireContext(), quotesModelList); recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); recyclerView.setAdapter(quotesAdapter); }
2. 集合初始化顺序错误
当前onCreateView中先调用jsonrequest()再初始化quotesModelList,会导致Volley请求回调中往空集合添加数据,引发潜在空指针异常。
修复: 调整顺序,先初始化集合再发起请求:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_quotes, container, false); recyclerView = view.findViewById(R.id.quotesRecyclerView); quotesModelList = new ArrayList<>(); // 先初始化集合 jsonrequest(); // 再发起网络请求 return view; }
3. Volley请求队列上下文优化
创建Volley请求队列时,使用QuotesFragment.this不如requireContext()安全,后者能避免Fragment已脱离Activity时的上下文失效问题。
修复:
requestQueue = Volley.newRequestQueue(requireContext()); requestQueue.add(request);
内容的提问来源于stack exchange,提问作者Usman Ijaz
相关产品推荐
相关产品推荐

