【问题标题】:Parse JSON data from assets folder in Recyclerview从 Recyclerview 中的 assets 文件夹中解析 JSON 数据
【发布时间】:2017-07-15 10:38:18
【问题描述】:

在我的应用程序中,我在资产文件夹中存储了一个 JSON 文件。现在我正在尝试解析本地 JSON 文件以在 recyclerview 中显示一些信息。我的 Json 文件看起来像这样。

     {
     "contacts":[
      {
        "_id": "57f762f1",
        "dn": "CNdreas ",
        "mobile": "123456",
        "mail": "and@yahoo.com",
        "name": "Hallo",
        "company": "xyz company",
        "department": "software",
        "title": "Junior Developer",
        "__v": 0,
        "updated_at": "2016-10-07T08:55:13.909Z"
      },
      {
        "_id": "57f7",
        "dn": "CNernard",
        "mobile": "1239855",
        "mail": "mail@yahoo.com",
        "name": "nameis",
        "company": "xyz Company",
        "department": "Inhouse",
        "__v": 0,
        "updated_at": "2016"
      },
     ..................lots of object

我想从这个文件中获取手机、邮件、姓名、公司、部门和职位。但在某些对象中不包括“标题”。在我的示例中显示。我尝试在 recyclerview 和 cardview 中解析这些信息。但每次我的应用程序崩溃。我没有得到如何解析这个 JSON 中的一些数据并显示在 RecyclerView 上。这是我的 JSON 数据模型类

public class MyColleageModel {
private String _id;
private String dn;
private String mobile;
private String mail;
private String name ;
private String company ;
private String department;
private String title ;
private int __v ;
private String updated_at;

public MyColleageModel() {

}

public MyColleageModel(String mobile, String mail,
                       String name, String company,
                       String department, String title) {

    this.mobile = mobile;
    this.mail = mail;
    this.name = name;
    this.company = company;
    this.department = department;
    this.title = title;
  }

public String get_id() {
    return _id;
}

public String getDn() {
    return dn;
}

public String getMobile() {
    return mobile;
}

public String getMail() {
    return mail;
}

public String getName() {
    return name;
}

public String getCompany() {
    return company;
}

public String getDepartment() {
    return department;
}

public String getTitle() {
    return title;
}

public int get__v() {
    return __v;
}

public String getUpdated_at() {
    return updated_at;
}
}

我的 MainActivity 是

public class MyColleaguesPage extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerView.Adapter adapter;
private List<MyColleageModel> colleagueObject;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);
    recyclerView=(RecyclerView)findViewById(R.id.colleagues_recycler);
    recyclerView.setHasFixedSize(true);
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);

    colleagueObject = new ArrayList<>();
    try {
        JSONObject obj = new JSONObject(loadJSONFromAsset());
        JSONArray m_jArry = obj.getJSONArray("contacts");
        ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
        HashMap<String, String> m_li;

        for (int i = 0; i < m_jArry.length(); i++) {
            JSONObject jo_inside = m_jArry.getJSONObject(i);
            String val1 = jo_inside.getString("mobile");
            String val2 = jo_inside.getString("mail");
            String val3 = jo_inside.getString("name");
            String val4 = jo_inside.getString("company");
            String val5 = jo_inside.getString("department");
            String val6 = jo_inside.optString("title");

            //Add your values in your `ArrayList` as below:
            m_li = new HashMap<String, String>();
            m_li.put("mobile", val1);
            m_li.put("mail",val2);
            m_li.put("name", val3);
            m_li.put("company",val4);
            m_li.put("department", val5);
            m_li.put("title",val6);

            formList.add(m_li);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    recyclerViewstart();
    loadJSONFromAsset();
    adapter = new MyColleaguesAdapter(colleagueObject,this);
    recyclerView.setAdapter(adapter);
}
private String loadJSONFromAsset() {
    String json = null;
    try {

        InputStream is = getAssets().open("colleagues.json");

        int size = is.available();

        byte[] buffer = new byte[size];

        is.read(buffer);

        is.close();

        json = new String(buffer, "UTF-8");


    } catch (IOException ex) {
        ex.printStackTrace();
        return null;
    }
    return json;


}

}

我收到空指针异常错误这是我的错误日志。我知道在某些情况下标题不包括在内。但是我怎样才能让我的所有数据都显示在 recyclerview 中而不会出现任何错误?

  07-15 10:51:05.927 2406-2406/? W/art: Before Android 4.1, method int 
  android.support.v7.widget.ListViewCompat.lookForSelectablePosition(int, 
   boolean) would have incorrectly overridden the package-private method in 
   android.widget.ListView
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err: 
  org.json.JSONException: No value for title
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
  org.json.JSONObject.get(JSONObject.java:389)
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
  org.json.JSONObject.getString(JSONObject.java:550)
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
  myColleagues.MyColleaguesPage.onCreate(MyColleaguesPage.java:55)
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
  android.app.Activity.performCreate(Activity.java:6662)
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 

 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
  07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.app.ActivityThread.-wrap12(ActivityThread.java)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.os.Handler.dispatchMessage(Handler.java:102)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.os.Looper.loop(Looper.java:154)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 android.app.ActivityThread.main(ActivityThread.java:6077)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 
 java.lang.reflect.Method.invoke(Native Method)
 07-15 10:51:08.049 2406-2406/com.testgrid W/System.err:     at 

【问题讨论】:

    标签: android json android-recyclerview android-json


    【解决方案1】:

    我认为你放错了 recyclerview init

    recyclerViewstart(); //first
    

    然后

    adapter = new MyColleaguesAdapter(colleagueObject,this);
    recyclerView.setAdapter(adapter);
    

    这样

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mycolleagues_layout);
    
        colleagueObject = new ArrayList<>();
        try {
            JSONObject obj = new JSONObject(loadJSONFromAsset());
            JSONArray m_jArry = obj.getJSONArray("contacts");
            ArrayList<HashMap<String, String>> formList = new ArrayList<HashMap<String, String>>();
            HashMap<String, String> m_li;
    
            ......
    
        } catch (JSONException e) {
            e.printStackTrace();
        }
    
        recyclerViewstart();
        adapter = new MyColleaguesAdapter(colleagueObject,this);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
    

    【讨论】:

    • 是的,我已经修改了。但现在我得到了空白页
    • 尝试在setAdapter后添加adapter.notifyDataSetChanged();
    • 我已经修改了我的代码并更改了日志。我的屏幕变空了
    【解决方案2】:

    你应该打电话给recyclerViewstart(),用这个找到recyclerView,然后你可以recyclerView.setAdapter(adapter);

    【讨论】:

    • 我已经修改了我的代码。但我得到了一个空页面
    【解决方案3】:

    您将数据设置为未初始化的 recyclerView。 移动这个

    recyclerView=(RecyclerView)findViewById(R.id.colleagues_recycler);

    紧跟在你的班级前列

    setContentView(R.layout.mycolleagues_layout);

    【讨论】:

    • 我已经修改了我的代码。但我得到的是空白页面,这里没有显示任何内容
    【解决方案4】:

    你可以使用 .optString("title");对于空标题响应 .getString("title");和上面一样

     String val6 = jo_inside.optString("title");
    

    这意味着它检查可选字符串标题以获取更多check this link

    【讨论】:

    • 谢谢我已经修改了。但问题是我正在处理空屏幕。我的页面中没有显示任何内容。我的代码有什么错误吗?
    猜你喜欢
    • 2023-03-22
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2012-04-07
    • 1970-01-01
    • 2023-03-24
    • 2021-05-29
    相关资源
    最近更新 更多