使用Volley解析JSON并在ListView展示时应用崩溃问题求助
解决ListView展示姓名崩溃的问题
嘿,我一眼就瞅出问题所在啦!你的Volley解析JSON的逻辑完全没问题,崩溃的核心原因是没有给Activity加载布局文件,导致ListView对象为null,调用setAdapter的时候直接炸了。下面给你一步步修复:
第一步:创建对应的布局文件
在res/layout目录下新建activity_main.xml,里面放一个id为nameList的ListView:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/nameList" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
第二步:修复MainActivity的onCreate方法
在onCreate里添加setContentView加载布局,这行代码是关键——没有它的话findViewById根本找不到控件:
public class MainActivity extends Activity { // json array response url private String urlJsonArry = "https://api.myjson.com/bins/1d60wu"; private String jsonResponse; ListView nameList; // 添加上TAG常量,避免VolleyLog报错 private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 关键:加载布局文件,必须放在findViewById之前 setContentView(R.layout.activity_main); nameList = (ListView) findViewById(R.id.nameList); JsonArrayRequest req = new JsonArrayRequest(urlJsonArry, new Response.Listener<JSONArray>() { @Override public void onResponse(JSONArray response) { try { // 给ArrayList指定泛型,更规范 ArrayList<String> al = new ArrayList<>(); for (int i = 0; i < response.length(); i++) { JSONObject person = (JSONObject) response.get(i); al.add(person.getString("name")); } ArrayAdapter<String> adapter = new ArrayAdapter<>(getApplicationContext(), android.R.layout.simple_list_item_1, al); nameList.setAdapter(adapter); } catch (JSONException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_SHORT).show(); } }); // Adding request to request queue RequestQueue rQueue = Volley.newRequestQueue(MainActivity.this); rQueue.add(req); } }
额外优化提示
- 给ArrayList指定
String泛型,避免编译警告,代码更严谨 - 添加了
TAG常量,让Volley的日志输出正常工作 - 确保你已经在
AndroidManifest.xml里添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" />
这样修改后,运行App就能正常把所有姓名展示在ListView里啦!
内容的提问来源于stack exchange,提问作者Opeyemi Sanusi
相关产品推荐
相关产品推荐

