Android异步循环,同时维持秩序

Android异步循环,同时维持秩序,android,loops,asynchronous,arraylist,Android,Loops,Asynchronous,Arraylist,我有一个android应用程序,它以JSON格式从网站获取数据,解析数据,然后将数据显示到RecyclerView中 对于一些数据,我必须基于最初接收到的数据执行第二个请求,因此我使用异步 我的问题是,在遍历项目并因此将其添加到recyclerview时,它们是按照请求检索的顺序添加的,而不是按照它们在映射中的顺序(逻辑上) JSON的格式与此类似: "ticket_posts":{ "221864":{ "id":"221864", "c

我有一个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);
            }
        });
List items=new ArrayList();
/**循环遍历所有条目,并将信息放入json元素的hashmap中*/
JsonObject ticketResponses=response.get(“ticket_posts”).getAsJsonObject();
Map attributes=newhashmap();
Set entrySet=ticketResponses.entrySet();
for(Map.Entry:entrySet){
attributes.put(entry.getKey(),ticketResponses.get(entry.getKey());
}
/**显示项目,设置适配器*/
final RecyclerListAdapter ticketAdapter=新的RecyclerListAdapter(控制器、项目);
RecyclerView ticketList=ticketFragment.getTicketRecyclerView();
ticketList.setAdapter(ticketAdapter);
setLayoutManager(新的LinearLayoutManager(controller.getContext());
/**启动循环以显示票证信息*/
for(JsonElement元素:attributes.values()){
final JsonObject ticketResponse=elem.getAsJsonObject();
字符串userId=ticketResponse.get(“user_id”).getAsString();
/**获取发布的用户信息*/
字符串url=“blahblahblah”;
get(url,null,新BaseJsonHttpResponseHandler()){
@凌驾
public void onSuccess(int statusCode,Header[]headers,String rawJsonResponse,JsonObject response){
字符串imageUrl=response.get(“avatarlink”).getAsString();
if(imageUrl.equals(“”){
imageUrl=Constants.DEFAULT\u FORUM\u AVATAR\u URL;
}
字符串username=response.get(“username”).getAsString();
字符串postCount=Integer.toString(response.get(“post_count”).getAsInt());
String rank=response.get(“rank”).getAsString();
Date postAddedDate=新日期((长)Integer.parseInt(ticketResponse.get(“time”).getAsString())*1000);
字符串postTime=新的SimpleDataFormat(“dd/MM/yyyy h:MM a”)。格式(postAddedDate);
字符串postContent=ticketResponse.get(“内容”).getAsString();
添加(新的LayoutPostLine(imageUrl、用户名、排名、postCount、postContent、postTime、false));
ticketAdapter.setItems(项目);
ticketAdapter.notifyItemInserted(items.size()-1);
}
/*
*获取解析响应的默认重写方法
*泛型类型JsonObject通过BaseJsonHttpResponseHandler传递
*/
@凌驾
公共JsonObject parseResponse(字符串rawJsonData,布尔值isFailure){
/**使用CyberGamerHttpClient中定义的默认响应解析器*/
返回CyberGamerHttpClient.parseResponse(rawJsonData,isFailure);
}
/**
*处理故障的默认重写方法
*/
@凌驾
public void onFailure(int statusCode,Header[]headers,Throwable Throwable,String rawJsonData,JsonObject errorResponse){
/**使用CyberGamerHttpClient中定义的默认故障处理程序*/
CyberGamerHttpClient.failureHandlerMethod(状态码、标题、错误响应、可丢弃);
}
});

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

HashMap和JSONObject都没有顺序的概念。在服务器和Android上使用LinkedHash map…记住插入顺序你可以根据自己的需要对json数据进行分类。当我说“顺序”时,我指的是它来自网站的顺序。它总是以相同的顺序来自网站,因此当从json对象转到json对象时,我需要在循环时保持该顺序