2017-02-11 6 views
-3

Я пытаюсь получить данные из цикла ArrayList, но он показывает, что список пуст, и arrayList.size() равно 0, даже мой adapter.getItemCount() также возвращает 0, но мой массивList не пуст. имеет, по меньшей мере, 2 или 3 данных, и это прекрасно размещая в RecyclerView, но до сих пор arrayList.size() является 0ArrayList.size Возвращает 0, но arryList не пуст

arrayList = Backgroundtask.getList(); 

    adapter = new RecycleAdapter(arrayList,getContext()); 

    ItemRecyclerView.setHasFixedSize(true); 
    layoutManager = new LinearLayoutManager(getActivity()); 
    ItemRecyclerView.setLayoutManager(layoutManager); 
    ItemRecyclerView.setAdapter(adapter); 

    for(int i = 0; i < arrayList.size(); i++){ 

     int quantity = arrayList.get(i).getQuantity(); 

     Total += quantity ; 
    } 
    Log.d("ArrayList Size " , String.valueOf(arrayList.size())); 
    Log.d("getItemCount Size " , String.valueOf(adapter.getItemCount())); 

это мой BackgroundTask:

public ArrayList<DataProvider> getList(){ 

    StringRequest stringRequest = new StringRequest(Request.Method.POST, jsonURL, 

      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 

        try { 
         JSONArray jsonArray = new JSONArray(response); 

         for(int i = 0; i < jsonArray.length(); i++){ 
          JSONObject jsonObject = jsonArray.getJSONObject(i); 
          DataProvider dataProvider = new DataProvider(jsonObject.getString("Name"), 
            jsonObject.getDouble("quantity")); 
          arrayList.add(dataProvider); 
         } 
         UserFragment.adapter.notifyDataSetChanged(); 

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

       } 
      },new Response.ErrorListener(){ 
     @Override 
     public void onErrorResponse(VolleyError volleyError){ 


     } 
    }) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 

      Map<String,String> param = new HashMap<String,String>(); 
      param.put("id",MainActivity.USER_ID.toString()); 
      return param; 
     } 
    }; 

    Singletone.getSingletone(context).addToRequest(stringRequest); 
    return arrayList; 
} 
+0

Вы можете обновить код BackgroundTask.getList) '' метода (? –

+0

'for (int i = 0; i

+0

кода недостаточно, чтобы распознать вашу проблему, в приведенном выше коде ваш список массивов будет пустым. пожалуйста, разделите весь файл. –

ответ

1

поэтому его глупая ошибка Thats происходит. Ваш запрос и ответ асинхронны. то есть ваш метод getList() возвращает пустой массив, так как ответ еще не получен. но так как вы написали adapter.notifyDatasetChanged() в своем ответе, вы можете увидеть элементы в RecyclerView.

Edit:

Помимо реализации есть несколько утечек памяти тоже. Поэтому я обновляю код здесь.

BlankFragment.java

public class BlankFragment extends Fragment implements BackgroundTask.UpdateListInterface{ 

    private Context mContext; 
    private List<DataProvider> arrayList; 
    private RecyclerView ItemRecyclerView; 
    private RecycleAdapter adapter; 

    public BlankFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     this.mContext = context; 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     arrayList = new ArrayList<>(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_blank, container, false); 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     ItemRecyclerView = view.findViewById(R.id.your_rc_view); 
    } 

    @Override 
    public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     adapter = new RecycleAdapter(arrayList,getContext()); 
     ItemRecyclerView.setHasFixedSize(true); 
     ItemRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); 
     ItemRecyclerView.setAdapter(adapter); 
     BackgroundTask.updateList(this); 
    } 

    @Override 
    public void updateList(List<DataProvider> dataProviders) { 
     arrayList.addAll(dataProviders); 
     for(int i = 0; i < arrayList.size(); i++){ 
      int quantity = arrayList.get(i).getQuantity(); 
      Total += quantity ; 
     } 
     adapter.notifyDatasetChanged(); 
    } 

} 

BackgroundTask.java

public class BackgroundTask { 
    public static void updateList(final UpdateListInterface updateListInterface){ 
     final List<DataProvider> arrayList = new ArrayList<>(); 
     StringRequest stringRequest = new StringRequest(Request.Method.POST, jsonURL, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         try { 
          JSONArray jsonArray = new JSONArray(response); 

          for(int i = 0; i < jsonArray.length(); i++){ 
           JSONObject jsonObject = jsonArray.getJSONObject(i); 
           DataProvider dataProvider = new DataProvider(jsonObject.getString("Name"), 
             jsonObject.getDouble("quantity")); 
           arrayList.add(dataProvider); 
          } 

          //Here is how you must communicate with your calling class. 
          updateListInterface.updateList(arrayList); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 

        } 
       },new Response.ErrorListener(){ 
      @Override 
      public void onErrorResponse(VolleyError volleyError){ 


      } 
     }) { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 

       Map<String,String> param = new HashMap<String,String>(); 
       param.put("id",MainActivity.USER_ID.toString()); 
       return param; 
      } 
     }; 

     Singletone.getSingletone(context).addToRequest(stringRequest); 
    } 

    public interface UpdateListInterface{ 
     void updateList(List<DataProvider> dataProviders); 
    } 
} 
+0

Итак, что мне делать? На самом деле я новичок в работе с запросом сервера. –

+0

Есть еще несколько утечек памяти, никто не может их исправить, пока они не будут иметь полный код. Но на время выше код решит вашу проблему. –

Смежные вопросы