JSON下载@ onCreateView将recyclelerView留空

时间:2016-02-08 19:29:43

标签: android json android-fragments download adapter

    if (isConnected()) {

        Event  eInstance = new Event();
        theEvents = eInstance.downloadEvents(eventsNightlife, getActivity());
        rAdapter = new RecyclerAdapter(theEvents);
        recyclerView.setAdapter(rAdapter);
        progrsBar.setVisibility(View.GONE);
        ....

这是在“onCreateView”上运行的代码的一部分。方法downloadEvents使用Volley下载JSON数据,提取它并返回项目列表(theEvents)。现在,当我的应用程序启动时,回收站视图为空。如果我从应用程序转到我的主屏幕,然后再次运行我的应用程序,这次有时会下载数据。

我一步一步地调试,并且在第一次启动时(我的意思是当应用程序不仅仅恢复时),事件为空,因此下载没有返回或设法返回任何内容......

有关如何在向用户显示用户界面之前执行操作的建议,或者为了更好地完成此任务需要采取哪些措施?

另外,我使用swipeRefreshLayout并在其onRefresh方法中执行:

public void onRefresh() {
    Event  eInstance = new Event();
    theEvents = eInstance.downloadEvents(eventsNightlife, getActivity());

    rAdapter.notifyDataSetChanged();

    swipeRefreshLayout.setRefreshing(false);
}

但它不起作用。我也试过

rAdapter = new RecyclerAdapter(theEvents);
    rAdapter.notifyDataSetChanged();
    recyclerView.swapAdapter(rAdapter, false); 

仍然无法正常工作。

编辑:我的downloadEvents方法实现了Volley:

public List<Event> downloadEvents(String urlService, Context context) {
    eventsList = new ArrayList<>();
    RequestQueue requestQueue = Volley.newRequestQueue(context);
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest
            (Request.Method.GET, urlService, null, new Response.Listener<JSONArray>() {

                @Override
                public void onResponse(JSONArray response) {

                    try {
                        String durationStr = null;


                        for (int i = 0; i < response.length(); i++) {
                            JSONObject eventJson = response.getJSONObject(i);

                            String title = eventJson.getString("EventTitle");
                            String body = eventJson.getString("EventBody");
                            String date = eventJson.getString("EventDate");
                            String time = eventJson.getString("EventTime");
                            int duration = Integer.parseInt(eventJson.getString("EventDuration"));
                            if (duration > 60) {
                                durationStr = "Duration: " + duration / 60 + " h";
                            } else if (duration < 60) {
                                durationStr = "Duration: " + duration + " m";
                            }
                            String place = eventJson.getString("EventPlace");
                            String organ = eventJson.getString("Organization");

                            Event event = new Event(title, body, date, time, durationStr, place, organ);
                            eventsList.add(event);

                        }

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

                }


            }, new Response.ErrorListener() {

                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("VOLLEY ERROR", "" + error);

                }
            }
            );
    requestQueue.add(jsonArrayRequest);
    return eventsList;
}

1 个答案:

答案 0 :(得分:0)

您可以将EventBus用于您的目的,这是一种简单而真实的方式 在这里,我写了一个示例,了解如何将EventBusvolley一起使用 考虑我想下载一些数据。

这是我的下载方法所在的类(您可以在以后添加更多方法):
我使用volley下载我的数据:

// Download methods is inside volley
public class MyDownloader{

    public static void downloadData(){
         DownloadDataEvent dlDataEvent=new DownloadDataEvent();
         List<String> myResult=new ArrayList<>();

             ...
             @Override
             public void onResponse(JSONArray response) {
                 super.onResponse(response);
                 if(respone!=null){
                     // Do what i want with my received data
                     dlDataEvent.setData(response);
                 }
                 // Post my event by EventBus
                 EventBus.getDefault().post(dlDataEvent);
              ...

         }
    }
}

这是我的活动:

public class DownloadDataEvent{
    private JSONArray mData;

    public void setData(JSONArray data){
         mData=data;
    }

    public JSONArray setData(){
        return mData;
    }

}

现在我想在MainActivity中使用我的downloadData()方法:
(我在onCreate内调用了我的downloadData方法。)

public class MainActivity extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         ...

         // I have to register this class for EventBus subscriber:
         if(!EventBus.getDefault().isRegister(this)){
              EventBus.getDefault().registerSticky(this);
         }

         // Call my downloadData method
         if(isConnected()){
              MyDownloader.downloadData();
         }
     }

     // And for receive the data through EventBus, i have to create a 
     //   method (subscriber) in this template:
     public void onEventMainThread(DownloadDataEvent downloadDataEvent){
          JSONArray result=downloadDataEvent.getData();
          // Do what i want with my received data
     }
}

您可以在每个要使用接收数据的位置创建多个订户。

  • 我将JSONArray传递给了我的DownloadDataEvent,但这并不好。您可以反序列化收到的数据并将其传递给DownloadDataEvent。
  • 我用Volley下载数据
  • 也许我的描述令人困惑,但EventBus是一个众所周知的图书馆并且非常易于使用。