【问题标题】:Last data is always displayed in ListView最后的数据总是显示在 ListView
【发布时间】:2017-06-20 05:23:26
【问题描述】:

这是我的示例json 结果

[  
 {
  "ApplicationId": "1609000001",
  "Status": "Submitted"
 },
 {
  "ApplicationId": "1609000002",
  "Status": "Received"
 },
{
  "ApplicationId": "1609000004",
  "Status": "Draft"
},
]

我正在使用Volley 来获取我的json 结果。我得到了正确的值,但是 ListView 上显示的项目继续显示最后一个项目,例如基于上面的示例 json 数据是 1609000004 它返回相同的值。就像结果是多少一样,例如 3,它将显示 3 1609000004 应用程序 id。

这是我的MainActivity

 ArrayList<Notification> submissionList; 
 ListView status_lv;

 onCreate(Bundle savedInstanceState) {
   status_lv = (ListView) findViewById(R.id.status_lv);
    statusList = new ArrayList<Notification>();

    callVolley();
    StatusAdapter adapter = new StatusAdapter(MainActivity.this, R.layout.listrow, statusList);
    status_lv.setAdapter(adapter);
   }

     private void callVolley() {
    JsonArrayRequest req = new JsonArrayRequest(Constants.URL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                try {
                    Notification status = new Notification();

                    for (int i = 0; i < 5; i++) {

                        JSONObject submissionObj = (JSONObject) response.get(i);
  status.setApplicationId(submissionObj.getString("ApplicationId"));
  status.setStatus(submissionObj.getString("Status"));

                 statusList.add(status);      
                    }

                } catch (JSONException e) {
                    e.printStackTrace();

                }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    requestQueue.add(req);
}

在检查我的for loop 后,我尝试输入Log,它得到了正确的数据,其中ApplicationId 是1609000001、1609000002、1609000004。但我不知道为什么它会在我的设备中显示最后一个值.感谢您的帮助。

【问题讨论】:

  • for (int i = 0; i &lt; 5; i++) { 更改为 for (int i = 0; i &lt; response.length(); i++) {。还要在 for 循环中初始化 Notification status = new Notification();
  • 你能分享你的列表适配器代码
  • @Piyush 我试图只显示返回的 json 结果的前 5 个。
  • @mori 阅读我的全部评论
  • @Piyush 谢谢你现在的工作

标签: android json listview


【解决方案1】:

添加你的代码行

Notification status = new Notification();

在如下循环内:

for (int i = 0; i < 5; i++) {

                        JSONObject submissionObj = (JSONObject) response.get(i);

Notification status = new Notification();
  status.setApplicationId(submissionObj.getString("ApplicationId"));
  status.setStatus(submissionObj.getString("Status"));

                 statusList.add(status);      
                    }

还可以在循环中添加“response.size”代替 i

【讨论】:

  • 如果我想获得前 5 个结果数据怎么办?如何在我的 for 循环中做到这一点?
  • 您可以以另一种方式执行此操作,1)首先检查 response.size>=5 然后在循环中使用 5 否则使用 respon.size 。 2) 在循环中仅使用 response.size 并在 "i==4" 时使用 break 语句中断循环。 3)您可以使用一种返回 List 并返回 if 循环的 i==5 的方法。
【解决方案2】:

在for循环后设置适配器

ArrayList<Notification> submissionList; 
ListView status_lv;

onCreate(Bundle savedInstanceState) {
    status_lv = (ListView) findViewById(R.id.status_lv);

    callVolley();

}

private void callVolley() {
    statusList = new ArrayList<Notification>();

    JsonArrayRequest req = new JsonArrayRequest(Constants.URL,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {

                try {


                    for (int i = 0; i < response.length(); i++) {
                        Notification status = new Notification();
                        JSONObject submissionObj = (JSONObject) response.get(i);
                        status.setApplicationId(submissionObj.getString("ApplicationId"));
                        status.setStatus(submissionObj.getString("Status"));

                        statusList.add(status);      
                    }

                    StatusAdapter adapter = new StatusAdapter(MainActivity.this, R.layout.listrow, statusList);
                    status_lv.setAdapter(adapter);

                } catch (JSONException e) {
                    e.printStackTrace();

                }

        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });
    requestQueue.add(req);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多