Android点击主分类传递对应子分类JSONArray到另一Activity遇异常
解决Android主分类点击传递子分类列表为空的问题
我来帮你搞定这个问题!看了你的代码后,发现三个关键错误导致子分类传递后列表为空,咱们一个个来修正:
1. JSON解析时没填充子分类数据
你在解析主分类的subcategory数组时,只拿到了jArray1,但完全没把里面的子分类数据解析成Pojo2对象,也没放到对应主分类的subCatagoryArrayList里。这就导致每个主分类的子分类列表从一开始就是空的,传递过去自然啥也没有。
修正后的解析代码
final JsonObjectRequest jsonObjReq = new JsonObjectRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { Log.d(TAG, response.toString()); try { JSONArray jArray = response.getJSONArray("data"); for (int i = 0; i < jArray.length(); i++) { JSONObject json_data = jArray.getJSONObject(i); Pojo dataPojo = new Pojo(); dataPojo.setCatagory_id(json_data.getString("category_id")); dataPojo.setCatagory_name(json_data.getString("category_name")); dataPojo.setCatagory_thumbnailUrl(json_data.getString("category_image")); // 新增:解析子分类数组并填充到subCatagoryArrayList JSONArray jArray1 = json_data.getJSONArray("subcategory"); ArrayList<Pojo2> subList = new ArrayList<>(); for (int j = 0; j < jArray1.length(); j++) { JSONObject subJson = jArray1.getJSONObject(j); Pojo2 subPojo = new Pojo2(); subPojo.setSubcatagory_id(subJson.getString("subcatagory_id")); subPojo.setSubcatagory_name(subJson.getString("subcatagory_name")); subList.add(subPojo); } dataPojo.setSubCatagoryArrayList(subList); dataList.add(dataPojo); } dataAdapter = new DataAdapter(dataList); dataAdapter.setClickListener(jsonDataClickListener); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(dataAdapter); dataAdapter.notifyDataSetChanged(); } catch (JSONException e) { e.printStackTrace(); // 别忘了捕获JSON解析异常,避免崩溃 } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 这里可以加个错误提示,比如Toast } });
2. 传递数据时传错了对象
你现在传递的是整个主分类列表dataList,但实际上你需要的是当前点击的那个主分类对应的子分类列表,也就是item.getSubCatagoryArrayList()。
修正后的点击事件代码
OnItemClickListener jsonDataClickListener = new OnItemClickListener() { @Override public void onItemClick(Pojo item) { Intent intent = new Intent(MainActivity.this, SubCategoryData.class); // 传递当前点击项的子分类列表,而不是整个主分类列表 intent.putExtra("Key", item.getSubCatagoryArrayList()); startActivity(intent); } };
3. Pojo2没实现Serializable接口
因为你传递的是ArrayList<Pojo2>,而Serializable要求泛型里的对象也必须是可序列化的。所以必须给Pojo2加上Serializable接口,否则传递的时候会失败,接收方拿到的就是空列表。
修正后的Pojo2类
public class Pojo2 implements Serializable { // 新增Serializable接口 private String subcatagory_id; private String subcatagory_name; public String getSubcatagory_id() { return subcatagory_id; } public void setSubcatagory_id(String subcatagory_id) { this.subcatagory_id = subcatagory_id; } public String getSubcatagory_name() { return subcatagory_name; } public void setSubcatagory_name(String subcatagory_name) { this.subcatagory_name = subcatagory_name; } }
最后:接收方正确获取数据
确保你在SubCategoryData里是这样接收数据的:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sub_category_data); // 获取传递过来的子分类列表 ArrayList<Pojo2> myList = (ArrayList<Pojo2>) getIntent().getSerializableExtra("Key"); // 现在就可以用myList来初始化你的RecyclerView Adapter了 }
按照这几步修正后,子分类列表应该就能正常传递并显示了!
内容的提问来源于stack exchange,提问作者MohammadAli
相关产品推荐
相关产品推荐

