如何从嵌套的 ArrayList 中获取 JSONObject 的属性并将其显示给 ListView?

Posted

技术标签:

【中文标题】如何从嵌套的 ArrayList 中获取 JSONObject 的属性并将其显示给 ListView?【英文标题】:How to fetch JSONObject’s properties from a nested ArrayList and showing it to ListView? 【发布时间】:2016-02-05 21:08:35 【问题描述】:

我有一个“wholeYearRiskArray”的 ArrayList,在 ArrayList 的每个索引处都有另一个 JSONObjects 的 ArrayList,其中包含每月的新闻/风险。每个指数代表一个月的新闻/风险。 我想在 ListView 中显示每个 JSONObject 的 displaydatesubject 属性。 因为每个月的数据都通过索引与其他月的数据分开。

我想在没有任何标签的 ViewPager 中生成片段。每个 Fragment 将保存一个月的每个数据。 Fragments会根据wholeYearRisksArray的大小动态生成。

这是调试模式下的图片。

http://i.imgur.com/3RvqDMn.png

这是我要实现的图片。

http://i.imgur.com/NQdkUXr.png

这是我的 MainActivity.java 代码。

public class MainActivity extends AppCompatActivity 

    public static String TAG = MainActivity.class.getSimpleName();
    ArrayList<Risks> risksArrayList = new ArrayList<>();
    HashMap<String, String> firstObjectHashMap = new HashMap<>();
    HashMap<String, String> lastObjectHashMap = new HashMap<>();
    String latestDateStr;
    String oldestDateStr;
    DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
    DateTime formatedLatestDate;
    DateTime formatedOldestDate;
    DateTime upDate;

    JSONArray filteredJSONArray = new JSONArray();
    ArrayList<ArrayList<JSONObject>> wholeYearRiskArray = new ArrayList<>();
    Risks risks = new Risks();
    private String JsonUrl = "https://api.myjson.com/bins/4goeq";  // https://api.myjson.com/bins/4goeq
    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RequestQueue queue = Volley.newRequestQueue(this);
        StringRequest req = new StringRequest(JsonUrl,

                new Response.Listener<String>() 
                    @Override
                    public void onResponse(String response) 

                        try 
                            JSONObject jsonObject = new JSONObject(response);
                            JSONArray jsonArray = jsonObject.getJSONArray("data");

                            for (int i = 0; i < jsonArray.length(); i++) 

                                JSONObject jsonObjectFromArray = jsonArray.getJSONObject(i);

                                if (jsonObjectFromArray.getString("publishtype").equals("PUBLISHED")) 

                                    filteredJSONArray.put(jsonObjectFromArray);

                                    risks.setUID(jsonObjectFromArray.getString("UID"));
                                    risks.setSubject(jsonObjectFromArray.getString("subject"));
                                    risks.setArticletext(jsonObjectFromArray.getString("articletext"));
                                    risks.setDisplaydate(jsonObjectFromArray.getString("displaydate"));
                                    risks.setPublishdate(jsonObjectFromArray.getString("publishdate"));
                                    risks.setKeywords(jsonObjectFromArray.getString("keywords"));
                                    risks.setPublishdate(jsonObjectFromArray.getString("publishtype"));
                                    risks.setTimestamp(jsonObjectFromArray.getString("timestamp"));

                                    risksArrayList.add(risks);
                                
                            
                            risksArrayList.get(0);

                            JSONObject firstObjectFromJsonArray = filteredJSONArray.getJSONObject(0);
                            JSONObject lastObjectFromJsonArray = filteredJSONArray.getJSONObject(filteredJSONArray.length() - 1);

                            firstObjectHashMap.put("UID", firstObjectFromJsonArray.getString("UID"));
                            firstObjectHashMap.put("subject", firstObjectFromJsonArray.getString("subject"));
                            firstObjectHashMap.put("articletext", firstObjectFromJsonArray.getString("articletext"));
                            firstObjectHashMap.put("displaydate", firstObjectFromJsonArray.getString("displaydate"));
                            firstObjectHashMap.put("publishdate", firstObjectFromJsonArray.getString("publishdate"));
                            firstObjectHashMap.put("keywords", firstObjectFromJsonArray.getString("keywords"));
                            firstObjectHashMap.put("publishtype", firstObjectFromJsonArray.getString("publishtype"));
                            firstObjectHashMap.put("timestamp", firstObjectFromJsonArray.getString("timestamp"));

                            lastObjectHashMap.put("UID", lastObjectFromJsonArray.getString("UID"));
                            lastObjectHashMap.put("subject", lastObjectFromJsonArray.getString("subject"));
                            lastObjectHashMap.put("articletext", lastObjectFromJsonArray.getString("articletext"));
                            lastObjectHashMap.put("displaydate", lastObjectFromJsonArray.getString("displaydate"));
                            lastObjectHashMap.put("publishdate", lastObjectFromJsonArray.getString("publishdate"));
                            lastObjectHashMap.put("keywords", lastObjectFromJsonArray.getString("keywords"));
                            lastObjectHashMap.put("publishtype", lastObjectFromJsonArray.getString("publishtype"));
                            lastObjectHashMap.put("timestamp", lastObjectFromJsonArray.getString("timestamp"));

                            oldestDateStr = firstObjectHashMap.get("publishdate");
                            latestDateStr = lastObjectHashMap.get("publishdate");

                            oldestDateStr = oldestDateStr.substring(0, 10);
                            oldestDateStr = oldestDateStr + " 00:00:00";

                            formatedOldestDate = fmt.parseDateTime(oldestDateStr);
                            formatedLatestDate = fmt.parseDateTime(latestDateStr);

                            int daysInMonth;

                            ArrayList<JSONObject> perMonthRisksArray = new ArrayList<JSONObject>();

                            while (formatedOldestDate.isBefore(formatedLatestDate) || formatedOldestDate.isEqual(formatedLatestDate)) 

                                daysInMonth = formatedOldestDate.dayOfMonth().getMaximumValue();
                                upDate = formatedOldestDate.plusDays(daysInMonth - 1);

                                long formatedLatestDateMillis = formatedOldestDate.getMillis();
                                long upDateMillis = upDate.getMillis();

                                perMonthRisksArray = fetchObjectsByDate(filteredJSONArray, formatedLatestDateMillis, upDateMillis);

                                wholeYearRiskArray.add(perMonthRisksArray);
                                formatedOldestDate = upDate.plusDays(1);

                            
                            wholeYearRiskArray.get(0);
                            Log.d(TAG, Integer.toString(wholeYearRiskArray.size()));
                            risksArrayList.get(0);

                         catch (JSONException e) 
                            e.printStackTrace();
                            Toast.makeText(getApplicationContext(),
                                    "Error: " + e.getMessage(),
                                    Toast.LENGTH_LONG).show();
                        
                    
                
                , new Response.ErrorListener() 
            @Override
            public void onErrorResponse(VolleyError error) 
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();

            
        
        );
        queue.add(req);
    

    public ArrayList<JSONObject> fetchObjectsByDate(JSONArray array, long startDate, long endDate) 
        final ArrayList<JSONObject> list = new ArrayList<>();

        for (int i = 0; i < array.length(); i++) 
            final JSONObject object = array.optJSONObject(i);
            if (object != null) 
                final String dateStr = object.optString("publishdate");
                if (dateStr != null) 

                    final long date = fmt.parseDateTime(dateStr).getMillis();
                    if ((date >= startDate) && (date <= endDate)) 
                        list.add(object);
                    
                
            
        
        return list;
    

这是我的 Risks.Java 代码。

public class Risks 

    String UID;
    String subject;
    String articletext;
    String displaydate;
    String publishdate;
    String keywords;
    String publishtype;
    String timestamp;

    public String getUID() 
        return UID;
    

    public void setUID(String UID) 
        this.UID = UID;
    

    public String getSubject() 
        return subject;
    

    public void setSubject(String subject) 
        this.subject = subject;
    

    public String getDisplaydate() 
        return displaydate;
    

    public void setDisplaydate(String displaydate) 
        this.displaydate = displaydate;
    

    public String getArticletext() 
        return articletext;
    

    public void setArticletext(String articletext) 
        this.articletext = articletext;
    

    public String getPublishdate() 
        return publishdate;
    

    public void setPublishdate(String publishdate) 
        this.publishdate = publishdate;
    

    public String getKeywords() 
        return keywords;
    

    public void setKeywords(String keywords) 
        this.keywords = keywords;
    

    public String getPublishtype() 
        return publishtype;
    

    public void setPublishtype(String publishtype) 
        this.publishtype = publishtype;
    

    public String getTimestamp() 
        return timestamp;
    

    public void setTimestamp(String timestamp) 
        this.timestamp = timestamp;
    

我应该使用 ListView 还是 TableLayout 或 LayoutInflator?

如何在没有任何选项卡的情况下动态生成片段并根据上述场景显示数据?

【问题讨论】:

你遇到了哪个错误或异常/ @ChiragSavsani 我没有收到错误或异常。但我找不到解决此问题的方法。 显示我的解决方案。希望对你有帮助。 @ChiragSavsani 这是我想向用户展示的图片。 link 但您的实际问题是什么?你只有一个数据还是什么都没有? 【参考方案1】:

好的,首先您需要将所有必需的内容添加到列表中。 那么您必须制作一个自定义列表并为您的列表制作单独的布局。 然后将该列表中的所有数据放入自定义列表。这就是解决方案。 看看这个https://***.com/a/8166802/5275639,它会对你有所帮助。

【讨论】:

【参考方案2】:

试试 Gson 库。从 JSON 到自定义用户模型的键值映射可以轻松完成,希望对您有所帮助!

【讨论】:

【参考方案3】:

使用 http://www.jsonschema2pojo.org/ 为您的 JSON 响应创建您的 POJO 类。然后使用 Gson 库将响应映射到 POJO 类。之后在 ViewPager 中显示它会容易得多。试一试

根据数组的大小动态创建片段。不需要有单独的片段。从 android Studio 创建一个示例 viewpager 片段示例,然后您将了解如何按时创建动态片段。默认情况下,您可以在 Internet 上的任何地方找到的默认视图寻呼机实现示例都没有标签。

【讨论】:

以上是关于如何从嵌套的 ArrayList 中获取 JSONObject 的属性并将其显示给 ListView?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 从 ajax 中的嵌套 JSON 对象中获取值

如何使用 SwiftyJSON 从深度嵌套的 JSON 字典中获取字符串 [重复]

如何在 swift 4 中使用 JSONDecoder 从嵌套 JSON 中获取数据?

从 JSON 检索数据但无法从 JSONobject 访问 Arraylist

从flutter中的多个嵌套json数组中获取值

使用React-Native从嵌套JSON获取数据