2016-10-30 24 views
0

私はAndroidでVolleyライブラリを使用していますが、JSONArrayRequestを作成すると自動的にnullが返されます。しかし、私がデバッグを続けている場合、2回目の試行では配列がいっぱいになります。ここに私のコードは次のとおりです。JSONリクエストで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

nice pointありがとうございますが、私は最初にJSON Array Requestを作成するとエラーが発生します。自動的に空のarrayListを返すようにジャンプし、onErrorまたはonResponseメソッドにも行きません。これは、フラグメントにrootviewを返した後に配列を塗りつぶします。いっぱいになると、何も起こりません。 – Burak

+0

コードに「return arrayList」はありません。私の例をもう一度見て、あなたのソリューションに統合してみてください。 –

+0

今、私は "E/RecyclerView:アダプターが接続されていない;レイアウトをスキップする"というエラーが出る。 RecyclerAdapterクラスを質問に追加しました – Burak

関連する問題