2016-08-04 8 views
-1

私はRecyclerViewを持つフラグメントにdoinbackgroundから2 String []を渡そうとしています。私はAsyncTaskのフラグメントの親アクティビティのツールバーにメソッドの実行呼び出しています私のAsyncTaskクラスですdoinbackgroundから2つの文字列配列をフラグメントに渡す

protected String[] doInBackground(String... params) { 
     try { 
      URL url=new URL(URL_Path); 
      connection= (HttpURLConnection) url.openConnection(); 
      connection.connect(); 


      InputStream inputStream=connection.getInputStream(); 
      reader=new BufferedReader(new InputStreamReader(inputStream)); 
      String line; 
      StringBuffer stringBuffer=new StringBuffer(); 
      while ((line=reader.readLine())!=null){ 
       stringBuffer.append(line); 

      } 
      String completeJSON=stringBuffer.toString(); 

      JSONArray parentArray=new JSONArray(completeJSON); 

      String[] Name=new String[parentArray.length()]; 
      String[] ImagePath=new String[parentArray.length()]; 
      for (int i = 0; i <parentArray.length() ; i++) { 
       JSONObject childObject=parentArray.getJSONObject(i); 

       String Fname=childObject.getString("First_Name") ; 
       String Lname=childObject.getString("Last_Name") ; 

       Name[i]=Fname+" "+Lname; 
       ImagePath[i]=childObject.getString("Image"); 
       Log.d(TAG,"String Arrays "+Name[i]+" "+ ImagePath[i]); 

        //GETTING ALL VALUES IN LOG SUCCESSFULLY 



      } 
      return Name; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 

      try { 
       connection.disconnect(); 
       if (reader!=null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 

@Override 
    protected void onPostExecute(String[] strings) { 
     super.onPostExecute(strings); 
    } 

私はまた、セッターゲッターメソッドを試してみましたが、それでもここで運

は私の断片は、ここで

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view=inflater.inflate(R.layout.activity_friend_list,container,false); 
     recyclerView= (RecyclerView) view.findViewById(R.id.RecyclerViewForFriendList); 

      //WANTS TO REPLACE THESE TWO ARRAY WITH WHICH I AM GETTING IN DOINBACKGROUND 
      Name=getResources().getStringArray(R.array.left_Drawer_Menu); 
      Image=getResources().obtainTypedArray(R.array.user_image); 

     recyclerView.setHasFixedSize(true); 

     adapter=new RecyclerFriendListAdapter(getActivity(),Distance,Image,LastSeen,Name); 
     recyclerView.setAdapter(adapter); 

     layoutManager=new LinearLayoutManager(getActivity()); 
     recyclerView.setLayoutManager(layoutManager); 



     return view; 
    } 

ではありません

更新日:

1)@BryanDunlapはonPostExecuteを求めた(そのちょうど、その内部には、コードを実装していない)そして、どのように断片

2で取得するには、両方の配列を返すように)@IrisLouisは私がセッターでやった方法ですインターフェイスを実装するために示唆したようにゲッターしかし、私はonCreateView

0で断片で取得AsyncTask

   Name[i]=Fname+" "+Lname; 
       ImagePath[i]=childObject.getString("Image"); 
       Log.d(TAG,"String Arrays "+Name[i]+" "+ ImagePath[i]); 
       //LOG RETURNS VALUE OF BOTH ARRAYS 

       WrapperClass w=new WrapperClass(); 
       w.setImagePath(ImagePath); 
       w.setImagePath(Name); 

でこれを設定する方法

ublic class WrapperClass { 

    private String[] Name; 
    private String[] ImagePath; 

    public String[] getImagePath() { 
     return ImagePath; 
    } 

    public void setImagePath(String[] imagePath) { 
     ImagePath = imagePath; 
    } 

    public String[] getName() { 

     return Name; 
    } 

    public void setName(String[] name) { 
     Name = name; 
    } 

動作していなかったと

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
           .... 
           .... 
           .... 
    WrapperClass wrapperClass=new WrapperClass(); 
      String[] Name=wrapperClass.getName(); 
      String[] ImagePath=wrapperClass.getImagePath(); 
      Log.d(TAG,Name.toString()+" "+ ImagePath.toString()) 


      //IT RETURNS NULLS 
+0

は、我々はいくつかの重要な情報を逃しています。 AsyncTaskのonPostExecute()呼び出しはどこですか?そこからdoInBackground()から返されたデータをあなたのフラグメントに渡す必要があります。 –

+0

@ブライアンダンラップ何のように? –

+0

あなたのためのソリューション。 onPostExcute()でインタフェースコールバックのデータを渡し、Fragmentに実装します。 –

答えて

0

あなたのための解決策は、それをテストすることができます。クラスAsynctaskで

は、インタフェースのコールバックの結果を作る:活動の

public class PageLoader extends AsyncTask<String, Void, String[] results> { 

    private Context context; 
    private LoaderListener mLoaderListener; 

    public PageLoader(Context context, LoaderListener mLoaderListener) { 
     this.context = context; 
     this.mLoaderListener = mLoaderListener; 
    } 

    public interface LoaderListener { 
     void onLoadCompleted(String[] results); 

     void onLoadFailed(); 

     void onPreparing(); 
    } 

    @Override 
    protected void onPreExecute() { 
     mLoaderListener.onPreparing(); 
    } 

    @Override 
    protected String[] doInBackground(String... params) { 
     try { 
      URL url=new URL(URL_Path); 
      connection= (HttpURLConnection) url.openConnection(); 
      connection.connect(); 


      InputStream inputStream=connection.getInputStream(); 
      reader=new BufferedReader(new InputStreamReader(inputStream)); 
      String line; 
      StringBuffer stringBuffer=new StringBuffer(); 
      while ((line=reader.readLine())!=null){ 
       stringBuffer.append(line); 

      } 
      String completeJSON=stringBuffer.toString(); 

      JSONArray parentArray=new JSONArray(completeJSON); 

      String[] Name=new String[parentArray.length()]; 
      String[] ImagePath=new String[parentArray.length()]; 
      for (int i = 0; i <parentArray.length() ; i++) { 
       JSONObject childObject=parentArray.getJSONObject(i); 

       String Fname=childObject.getString("First_Name") ; 
       String Lname=childObject.getString("Last_Name") ; 

       Name[i]=Fname+" "+Lname; 
       ImagePath[i]=childObject.getString("Image"); 
       Log.d(TAG,"String Arrays "+Name[i]+" "+ ImagePath[i]); 

        //GETTING ALL VALUES IN LOG SUCCESSFULLY 



      } 
      return Name; 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } finally { 

      try { 
       connection.disconnect(); 
       if (reader!=null) { 
        reader.close(); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(String[] results) { 
     if (results!= null) { 
      mLoaderListener.onLoadCompleted(results); 
     } else { 
      mLoaderListener.onLoadFailed(); 
     } 
    } 


} 

あなたがAsynctaskを実行します。

フラグメントでは、LoaderListenerおよびOverride three関数を実装する必要があります。

例:あなたはonLoadCompleted

例では結果のコールバックを処理することができますYourFragment extends Fragment implements LoaderListener

@Override 
public void onLoadCompleted(String[] results){ 
    //Do something with results 
} 
+0

私はすぐにお手伝いをしてくれてありがとう –

関連する問題