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

时间:2015-11-05 06:01:35

标签: java android json arraylist android-listview

我有一个'wholeYearRiskArray'的ArrayList,在ArrayList的每个索引处都有另一个JSONObjects的ArrayList,它包含每月的新闻/风险。每个指数代表一个月的新闻/风险。 我想在ListView中显示每个JSONObject的displaydatesubject属性。 因为每个月的数据由其他月份数据按索引分隔。

我想在没有任何标签的情况下在ViewPager中生成片段。每个片段将保存一个月的每个数据。片段将根据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?

如何根据上述方案生成没有任何标签的动态片段并显示数据?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

根据数组的大小动态创建片段。无需单独的片段。从Android Studio创建示例viewpager片段示例,然后您将了解如何按时获得动态片段。默认情况下,您可以在互联网上的任何位置找到的默认视图寻呼机实施示例都没有标签。