如何将JSON对象解析到TabLayout?解析时出现前置空标签问题
问题原因分析
你遇到的空标签问题,核心原因有两个:
- 你手动给
TabLayout添加标签后,又调用了tabLayout.setupWithViewPager(viewPager)——这个方法会清除TabLayout原有的所有标签,然后完全根据ViewPagerAdapter的getPageTitle()方法重新生成标签,手动添加的标签其实根本不会生效。 - 你的
ViewPagerAdapter里getPageTitle(int i)方法是从i=0开始取JSON数据,但你的JSON结构里键是从1开始的(比如1、2、3...),所以当i=0时,jsonObject.getJSONObject("0")找不到对应数据,返回null,就出现了第一个空标签。
解决方案
步骤1:移除手动添加Tab的冗余代码
删掉categoryurl()方法里循环添加Tab的代码块,因为setupWithViewPager会自动生成标签,手动添加的代码完全多余:
// 删掉这段无效代码 for (i = 1; i <=jsonObject.length(); i++) { Log.e(TAG, " Categorylist:" + jsonObject); JSONObject jsonObject1 = (JSONObject) jsonObject.getJSONObject(String.valueOf(i)); tabLayout.addTab(tabLayout.newTab().setText(jsonObject1.getString("category"))); }
步骤2:修正ViewPagerAdapter的索引匹配
因为JSON的键是从1开始的,而ViewPager的索引是从0开始的,所以需要把getPageTitle和getItem里的索引做+1转换:
@Override public CharSequence getPageTitle(int i) { try { // 用i+1匹配JSON中从1开始的键 return jsonObject.getJSONObject(String.valueOf(i + 1)).getString("category"); } catch (JSONException e) { e.printStackTrace(); } // 避免返回null,返回空字符串兜底 return ""; } @Override public Fragment getItem(int i) { // 如果Fragment需要用到分类的索引,这里也要同步改成i+1 return PoliticalFragment.getInstance(i + 1); }
修改后的完整代码示例
修正后的categoryurl()方法
private void categoryurl() { StringRequest stringRequest = new StringRequest(Request.Method.GET, "https://godigitalpath.com/app/knn/category.php", new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); // 直接初始化适配器并关联ViewPager与TabLayout ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), jsonObject); viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 建议添加错误提示,提升用户体验 Toast.makeText(MainActivity.this, "分类加载失败,请稍后重试", Toast.LENGTH_SHORT).show(); } }); RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this); requestQueue.add(stringRequest); }
修正后的ViewPagerAdapter类
public class ViewPagerAdapter extends FragmentPagerAdapter { private JSONObject jsonObject; public ViewPagerAdapter(FragmentManager manager, JSONObject jsonObject) { super(manager); this.jsonObject= jsonObject; } @Override public Fragment getItem(int i) { return PoliticalFragment.getInstance(i + 1); } @Override public int getCount() { return jsonObject.length(); } @Override public CharSequence getPageTitle(int i) { try { return jsonObject.getJSONObject(String.valueOf(i + 1)).getString("category"); } catch (JSONException e) { e.printStackTrace(); } return ""; } }
这样修改后,setupWithViewPager会根据适配器的getPageTitle正确生成所有标签,空标签的问题就解决了。另外注意getItem里的参数,如果PoliticalFragment需要用到分类的对应数据,一定要同步用i+1来匹配JSON的键哦。
内容的提问来源于stack exchange,提问作者krishna sai maddamsetti
相关产品推荐
相关产品推荐

