2017-06-27 6 views
0

私はPHPの/ mysqlデータベースから取得したものを追加するカスタムArrayListを持っています。今、私がその物を追加すると、arraylistは正しく塗りつぶされますが、別の関数でarraylistを使用しようとすると、空になります。何が問題ですか?別の関数でArraylistが空になる

public class SetTask extends Fragment { 

ListView lv_task_chooser; 
ArrayList<SetTaskModel> setTaskModelArrayList; 
private SetTaskAdapter setTaskAdapter; 
ArrayAdapter<String> scAdapter; 
String url, category; 
RequestQueue queue_fetch; 
ConnectivityManager connMgr; 
NetworkInfo networkInfo; 
Context ctx; 
LinearLayout taskLayout; 
private String[] array; 
private int[] sub_cat_id; 
JSONArray jsonArray; 

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

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

    ctx = getContext(); 

    lv_task_chooser = (ListView)rootView.findViewById(R.id.lv_task_chooser); 
    taskLayout = (LinearLayout)rootView.findViewById(R.id.taskLayout); 

    queue_fetch = Volley.newRequestQueue(ctx); 

    setTaskModelArrayList = new ArrayList<>(); 

    fetchDB(); 

    Log.i("pointafterfetch", "reached"); 
    Log.i("numberofarrayentries", String.valueOf(setTaskModelArrayList.size())); 

    for (int i = 0; i < setTaskModelArrayList.size(); i++){ 
     Log.i("arrayentriesfetch", setTaskModelArrayList.get(i).toString()); 
    } 

    setTaskAdapter = new SetTaskAdapter(setTaskModelArrayList, ctx); 
    lv_task_chooser.setAdapter(setTaskAdapter); 

    lv_task_chooser.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      populateSpinner(position); 
     } 
    }); 

    return rootView; 

} 

private void fetchDB(){ 

    url = "http://nmstech.in/coach/categorys.php"; 

    connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
    networkInfo = connMgr.getActiveNetworkInfo(); 

    if (!(networkInfo != null && networkInfo.isConnected())) { 
     final AlertDialog.Builder builder1 = new AlertDialog.Builder(ctx); 
     builder1.setTitle(getString(R.string.network_no_t)); 
     builder1.setMessage(getString(R.string.network_no_m)); 
     builder1.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
      } 
     }); 

     builder1.create().show(); 
    } 

    else{ 

     StringRequest strreq_fetch = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String Response) { 
         try { 
          jsonArray = new JSONArray(Response); 

          for(int i = 0; i < jsonArray.length(); i++){ 

           setTaskModelArrayList.add(new SetTaskModel(jsonArray.getJSONObject(i) 
             .getString("cat_name"))); 
           Log.i("arraylistentries", setTaskModelArrayList.get(i).getCategory()); 
           Log.i("noentries", String.valueOf(setTaskModelArrayList.size())); 
          } 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError e) { 
       e.printStackTrace(); 
      } 
     }); 

     Log.i("pointnotesfetch", "reached"); 
     queue_fetch.add(strreq_fetch); 
    } 
} 

private void populateSpinner(int position){ 

    category = lv_task_chooser.getItemAtPosition(position).toString(); 

    final AlertDialog.Builder builder = new AlertDialog.Builder(ctx); 
    builder.setTitle("Subtopics"); 

    connMgr = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
    networkInfo = connMgr.getActiveNetworkInfo(); 

    try { 
     for (int i = 0; i < jsonArray.getJSONArray(position).length(); i++){ 

      array[i] = jsonArray.getJSONArray(position).getJSONObject(i).getString("sub_cat_name"); 
      sub_cat_id[i] = jsonArray.getJSONArray(position).getJSONObject(i).getInt("sub_cat_id"); 
     } 
    } 
    catch (Exception e){ 
     e.printStackTrace(); 
    } 

    builder.setItems(array, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 

      Bundle cat_args = new Bundle(); 
      cat_args.putInt("sub_cat_id", sub_cat_id[which]); 
      cat_args.putString("sub_cat", array[which]); 

      Fragment fragment = new Exercise(); 
      FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction(); 
      fragment.setArguments(cat_args); 
      fragmentTransaction.replace(R.id.mainFrame, fragment); 
      fragmentTransaction.commit(); 
     } 
    }); 

    builder.show(); 
} 
} 

これは私のAndroidのモニター出力です: This is my Android monitor output:

+0

ブロはしないでくださいここにコード全体をコピーして貼り付ける...理解できる最小限で効果的なコードを与えるようにしてください –

+0

*別の関数でarraylistを使用しようとしたとき*とはどういう意味ですか?それはいつどこで使うのですか? –

+1

私はあなたの接続が使用しているコードの後に​​結果を与えていることがわかります。それを使用するデータの応答を待つだけです。 – Ivan

答えて

0

fecthDbが応答を取得する前に、 'setTaskModelArrayList' の上に行っています。

データを処理し、応答が得られた後でなければなりません。例えば

@Override 
public void onResponse(String Response) { 
    /* your code */ 
    onListChanged(); 
} 

public void onListChanged() { 
     Log.i("numberofarrayentries", String.valueOf(setTaskModelArrayList.size())); 

for (int i = 0; i < setTaskModelArrayList.size(); i++){ 
    Log.i("arrayentriesfetch", setTaskModelArrayList.get(i).toString()); 
} 
} 
+0

しかし、fetchDB()の実行が終了すると、コントロールはonCreateView()に戻り、2つのLogステートメントが実行されます。回答に使用したonResponse()メソッドにはどのようなコードを記述しますか? –

+0

あなたはnotifyDataSetChanged()を使用できます。 またはフェッチが完了した後にアダプタを設定する – fbwnd

0

onResponseメソッドは非同期と呼ばれています。 arraylistは空で、元のリストが変更されたときにsize.adaperに通知する必要があります。

setTaskAdapter.notigyDataSetChanged(); 
0

ボレーリクエストの実行は非同期です。したがって、基本的にArrayListは、それを印刷しようとすると空になります。

あなたは、関数に

void func() 
{ 
    Log.i("pointafterfetch", "reached"); 
    Log.i("numberofarrayentries",String.valueOf(setTaskModelArrayList.size())); 
    for (int i = 0; i < setTaskModelArrayList.size(); i++) 
    { 
     Log.i("arrayentriesfetch", setTaskModelArrayList.get(i).toString()); 
    } 
    setTaskAdapter = new SetTaskAdapter(setTaskModelArrayList, ctx); 
    lv_task_chooser.setAdapter(setTaskAdapter); 
} 

を作るターン、あなたfetchDb()

private void fetchDB() 
{ 
. 
. 

else 
{ 
    StringRequest strreq_fetch = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String Response) { 
        try { 
         jsonArray = new JSONArray(Response); 

         for(int i = 0; i < jsonArray.length(); i++) 
         { 
          setTaskModelArrayList.add(newSetTaskModel(jsonArray.getJSONObject(i).getString("cat_name"))); 
         } 
         func(); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 

} 

では、このメソッドを呼び出している何ができるか、あなたのoncreateは次のようになります。

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

    ctx = getContext(); 

    lv_task_chooser = (ListView)rootView.findViewById(R.id.lv_task_chooser); 
    taskLayout = (LinearLayout)rootView.findViewById(R.id.taskLayout); 

    queue_fetch = Volley.newRequestQueue(ctx); 

    setTaskModelArrayList = new ArrayList<>(); 

    fetchDB(); 

    lv_task_chooser.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      populateSpinner(position); 
     } 
    }); 

    return rootView; 

} 
関連する問題