2016-10-30 2 views
0

Я использую библиотеку Volley на Android, но когда я делаю JSONArrayRequest, он автоматически возвращает null. Но если я продолжаю отлаживать, во второй попытке он заполняет массив. Вот мои коды:JSON Request возвращает null

BackgroundTask.java

public class BackgroundTask{ 

    Context context; 
    ArrayList<Dua> arrayList = new ArrayList<>(); 
    String json_url = "http://www.burakakyalcin.site/getDua.php"; 

    public BackgroundTask(Context context){ 
     this.context = context; 
    } 

    public ArrayList<Dua> getList(){ 
     JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, json_url, (String)null, new Response.Listener<JSONArray>() { 
      @Override 
      public void onResponse(JSONArray response) { 
       int count = 0; 
       while(count<response.length()){ 
        try { 
         JSONObject jsonObject = response.getJSONObject(count); 
         Dua dua = new Dua(jsonObject.getString("DuaId"),jsonObject.getString("DuaSender"),jsonObject.getString("DuaHeader"), 
          jsonObject.getString("DuaText"),jsonObject.getString("DuaLike")); 
         arrayList.add(dua); 
         count++; 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show(); 
       error.printStackTrace(); 
      } 
     }); 
     MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest); 
     return arrayList; 
    } 

} 

MyFragment.java

public class MyFragment extends Fragment{ 

    RecyclerView recyclerView; 
    RecyclerView.Adapter adapter; 
    RecyclerView.LayoutManager layoutManager; 
    ArrayList<Dua> arrayList = new ArrayList<>(); 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_my, container, false); 
     recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 
     layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
     recyclerView.setHasFixedSize(true); 
     BackgroundTask backgroundTask = new BackgroundTask(getActivity().getApplicationContext()); 
     arrayList = backgroundTask.getList(); 
     adapter = new RecyclerAdapter(arrayList); 
     recyclerView.setAdapter(adapter); 
     return rootView; 
    } 


} 

RecyclerAdapter.java

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> { 

ArrayList<Dua> arrayList = new ArrayList<>(); 

public RecyclerAdapter(ArrayList<Dua> arrayList){ 
    this.arrayList = arrayList; 
} 


public void setArrayList (ArrayList<Dua> arrayList){ 
    this.arrayList=arrayList; 
    notifyItemRangeChanged(0, arrayList.size()); 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_item, parent, false); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    holder.DuaSender.setText(arrayList.get(position).getDuaSender()); 
    holder.DuaHeader.setText(arrayList.get(position).getDuaHeader()); 
    holder.DuaLike.setText(arrayList.get(position).getDuaLike()); 
} 

@Override 
public int getItemCount() { 
    return arrayList.size(); 
} 

public static class MyViewHolder extends RecyclerView.ViewHolder{ 

    TextView DuaHeader, DuaSender, DuaLike; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     DuaHeader = (TextView) itemView.findViewById(R.id.duaHeaderRec); 
     DuaSender = (TextView) itemView.findViewById(R.id.duaSenderRec); 
     DuaLike = (TextView) itemView.findViewById(R.id.duaLikeRec); 
    } 
} 
} 
+0

Уверены ли вы, что он возвращает null, а не пустой список при первом звонке? –

+0

@AlexeySoshin да, он возвращает пустой список – Burak

ответ

2

JsonArrayRequest является асинхронным.

Когда вы звоните

arrayList = backgroundTask.getList(); 

Прежде всего вы получите пустой список:

ArrayList<Dua> arrayList = new ArrayList<>(); 

И только после того, как HTTP вызовов преуспевает, он будет заполнен. Итак, в основном вам нужно дождаться результата, прежде чем использовать его.

public class BackgroundTask{ 

Context context; 
Fragment fragment; 
ArrayList<Dua> arrayList = new ArrayList<>(); 
String json_url = "http://www.burakakyalcin.site/getDua.php"; 

public BackgroundTask(Context context, MyFragment fragment){ 
    this.context = context; 
    this.fragment = fragment; 
} 

public void getList(){ 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.POST, json_url, (String)null, new Response.Listener<JSONArray>() { 
     @Override 
     public void onResponse(JSONArray response) { 
       // Map the JSON as you did before 

       // Call your fragment 
       fragment.setList(arrayList); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(context, error.toString(), Toast.LENGTH_LONG).show(); 
      error.printStackTrace(); 
     } 
    }); 

    MySingleton.getInstance(context).addToRequestQueue(jsonArrayRequest); 
} 

В вашем фрагменте нужен метод сеттера. Только после его вызова вы должны сделать список:

public class MyFragment extends Fragment{ 
RecyclerView recyclerView; 
RecyclerView.Adapter adapter; 
RecyclerView.LayoutManager layoutManager; 
ArrayList<Dua> arrayList = new ArrayList<>(); 
@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_my, container, false); 


    recyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerview); 
    layoutManager = new LinearLayoutManager(getActivity().getApplicationContext()); 
    recyclerView.setHasFixedSize(true); 

    BackgroundTask backgroundTask = new BackgroundTask(getActivity().getApplicationContext(), this); 


    return rootView; 
} 

public void setList(List<Dua> list) { 
    adapter = new RecyclerAdapter(list); 
    recyclerView.setAdapter(adapter); 
} 

} 
+0

благодарит хороший момент, но у меня все еще есть ошибка, когда я впервые делаю JSON Array. Запросить автоматически перескакивает, чтобы возвращать массивList, который пуст, даже не идет на метод onError или onResponse. Он заполняет массив после того, как он возвращает rootview в фрагменте. После того, как он заполняется, ничего не происходит. – Burak

+0

В вашем коде не должно быть никакого «return arrayList». Повторите мой пример и попытайтесь интегрироваться в свое решение. –

+0

теперь я получаю сообщение «E/RecyclerView: адаптор не подключен, пропуская макет». Я добавил класс RecyclerAdapter к вопросу – Burak

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