Android Async循环同时保持秩序

时间:2015-10-31 10:17:07

标签: android loops asynchronous arraylist

我有一个Android应用程序,它以JSON格式从网站获取数据,解析它,然后将其显示到RecyclerView中。

对于某些数据,我必须根据初始接收的数据做第二次请求,所以我正在使用异步。

我的问题是,在循环浏览项目并因此将它们添加到recyclerview时,它们是按请求检索的顺序添加的,而不是它们在地图中的顺序(逻辑上)。

JSON的格式与此类似:

"ticket_posts":{  
      "221864":{  
         "id":"221864",
         "content":"content",
         "user_id":"282200",
         "time":"1446094213"
      },
       "221866":{  
         "id":"221866",
         "content":"content",
         "user_id":"282300",
         "time":"1446094213"
      },    
      "221870":{  
         "id":"221870",
         "content":"content",
         "user_id":"282250",
         "time":"1446094213"
      }
  }

这是我到目前为止的代码:

    List<Object> items = new ArrayList<>();

    /** Loop through all entries and get the information into a hashmap of json elements */
    JsonObject ticketResponses = response.get("ticket_posts").getAsJsonObject();
    Map<String, JsonElement> attributes = new HashMap<>();
    Set<Map.Entry<String, JsonElement>> entrySet = ticketResponses.entrySet();
    for (Map.Entry<String, JsonElement> entry : entrySet) {
        attributes.put(entry.getKey(), ticketResponses.get(entry.getKey()));
    }

    /** Display the items, set up the adapter */
    final RecyclerListAdapter ticketAdapter = new RecyclerListAdapter(controller, items);
    RecyclerView ticketList = ticketFragment.getTicketRecyclerView();
    ticketList.setAdapter(ticketAdapter);
    ticketList.setLayoutManager(new LinearLayoutManager(controller.getContext()));


    /** Start the loop through to display ticket information */
    for(JsonElement elem : attributes.values()) {
        final JsonObject ticketResponse = elem.getAsJsonObject();
        String userId = ticketResponse.get("user_id").getAsString();

        /** Get the posted users information */
        String url = "blahblahblah";
        AppHttpClient.get(url, null, new BaseJsonHttpResponseHandler<JsonObject>() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, String rawJsonResponse, JsonObject response) {
                String imageUrl = response.get("avatarlink").getAsString();
                if(imageUrl.equals("")) {
                    imageUrl = Constants.DEFAULT_FORUM_AVATAR_URL;
                }
                String username = response.get("username").getAsString();
                String postCount = Integer.toString(response.get("post_count").getAsInt());
                String rank = response.get("rank").getAsString();
                Date postAddedDate = new Date((long)Integer.parseInt(ticketResponse.get("time").getAsString())*1000);
                String postTime = new SimpleDateFormat("dd/MM/yyyy h:mm a").format(postAddedDate);
                String postContent = ticketResponse.get("content").getAsString();

                items.add(new LayoutPostLine(imageUrl, username, rank, postCount, postContent, postTime, false));
                ticketAdapter.setItems(items);
                ticketAdapter.notifyItemInserted(items.size() - 1);

            }

            /*
             * Default overridden method for getting parsed response
             * Generic type JsonObject is passed through BaseJsonHttpResponseHandler
             */
            @Override
            public JsonObject parseResponse(String rawJsonData, boolean isFailure) {
                /** Use default response parser defined in CyberGamerHttpClient */
                return CyberGamerHttpClient.parseResponse(rawJsonData, isFailure);
            }

            /**
             * Default overridden method for handling failure
             */
            @Override
            public void onFailure(int statusCode, Header[] headers, Throwable throwable, String rawJsonData, JsonObject errorResponse) {
                /** Use the default failure handler defined in CyberGamerHttpClient */
                CyberGamerHttpClient.failureHandlerMethod(statusCode, headers, errorResponse, throwable);
            }
        });

我只是想知道如何将它们以与从网站中检索到的顺序相同的顺序添加到recyclerview中,同时仍然可以使用asynctask来获取它们的数据。

0 个答案:

没有答案
相关问题