0

こんにちは、私はola/uberソートアプリケーションを作成しようとしています。 私はedit-textにテキストを入力しており、その場所APIに基づいて、提案の配列が形成されています。この配列は、以下に示すクラスの配列を使用して形成されます。フラグメントの変更中に完全なバンドルが取得されない

import com.google.android.gms.location.places.Place; 

import java.io.Serializable; 

public class SearchListProvider implements Serializable { 
    private int imageId; 
    private String name; 
    private Place place; 

    public SearchListProvider(int imageId, String name, Place place) { 
     this.imageId = imageId; 
     this.name = name; 
     this.place = place; 
    } 

    public String getName() { 
     return name; 
    } 

    public int getImageId() { 
     return imageId; 
    } 


    public Place getPlace() { 
     return place; 
    } 

    public void setPlace(Place place) { 
     this.place = place; 
    } 

    public void setImageId(int imageId) { 

     this.imageId = imageId; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

私のアダプタの部分は、どこにドロップダウンですべての値を添付するかを示しています。

public void onBindViewHolder(final RecyclerViewHolder holder, int position) { 
    SearchListProvider listProvider = null; 
    if(holder.viewtype == TYPE_LIST){ 
     listProvider= arrayList.get(position); 
     holder.list_image.setImageResource(listProvider.getImageId()); 
     holder.address_name.setText(listProvider.getName()); 
     (holder.itemView).setTag(listProvider); 
    } 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Fragment f= new AmbulanceMap(); 
      Bundle b= new Bundle(); 
      SearchListProvider p= (SearchListProvider) (v).getTag(); 
      b.putSerializable("selectedLocation", p); 
      f.setArguments(b); 
      activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_container, f).commit(); 
     } 
    }); 
} 

すべてがここまでうまくいっています。今すぐドロップダウンのアイテムをクリックすると、フラグメントが変更され、シリアル化オブジェクトが別のフラグメントに送信され、そこで取得しようとします。しかし、私はデータの半分しか得られません。

Bundle b= getArguments(); 
    if(b != null){ 
     SearchListProvider p= (SearchListProvider)b.getSerializable("selectedLocation"); 
     if(p != null){ 
      LatLng latLng= p.getPlace().getLatLng(); 
      //setCurrentLocationMarker(latLng); 
      Toast.makeText(getContext(), latLng.latitude + "", Toast.LENGTH_SHORT).show(); 
     } 

    } 

デバッグ時に、場所の値がnullであることがわかりました。 理由がわかりません。 誰か助けてくれますか?

NB:getTag()関数自体がnull値をplaceに与えています。

は今、私は機能

p.getPlace().getName() 

を評価しようと、私は

Method threw 'java.lang.IllegalArgumentException' exception. 
    cause = Object has been collected 
detailMessage = Object has been collected 
stackState = Object has been collected 
stackTrace = Object has been collected 

新しい編集 - この関数としてエラーを取得していますplaceIdを取り、場所を返す

protected ArrayList<SearchListProvider> doInBackground(String... params) { 
    String inputText= params[0]; 
    PendingResult<AutocompletePredictionBuffer> autocompletePredictions = geoDataApi. 
      getAutocompletePredictions(GoogleClient.getIstance(), inputText, null, null); 
    AutocompletePredictionBuffer autocompletePredictionBuffer = autocompletePredictions.await(); 
    ArrayList<SearchListProvider> searchList= new ArrayList<>(); 
    for(int i=0; i<autocompletePredictionBuffer.getCount(); i++){ 

     geoDataApi.getPlaceById(GoogleClient.getIstance(), autocompletePredictionBuffer.get(i).getPlaceId()).setResultCallback(new ResolvingResultCallbacks<PlaceBuffer>(fragmentActivity, 0) { 
      @Override 
      public void onSuccess(@NonNull PlaceBuffer places) { 
       p = places.get(0); 
       places.release(); 
      } 

      @Override 
      public void onUnresolvableFailure(@NonNull com.google.android.gms.common.api.Status status) { 

      } 
     }); 
     searchList.add(
       new SearchListProvider(
         R.mipmap.ic_launcher, 
         autocompletePredictionBuffer.get(i).getFullText(null).toString(), 
         p) 
     ); 
    } 
    return searchList; 
} 

答えて

0

試用:

holder.itemView.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Fragment f= new AmbulanceMap(); 
     Bundle b= new Bundle(); 
     b.putSerializable("selectedLocation", listProvider); 
     f.setArguments(b); 
     activity.getSupportFragmentManager().beginTransaction().replace(R.id.main_container, f).commit(); 
    } 
}); 
+0

はあなたのオートコンプリート予測リスト

private ResultCallback<PlaceBuffer> mUpdatePlaceDetailsCallback = new ResultCallback<PlaceBuffer>() { @Override public void onResult(@NonNull PlaceBuffer places) { if (!places.getStatus().isSuccess()) { // Request did not complete successfully places.release(); return; } // Get the Place object from the buffer. final Place place = places.get(0); lat = place.getLatLng().latitude; lng = place.getLatLng().longitude; places.release(); } }; 

など、それを使用するため、このコールバックを試してみてください。 –

+0

listProviderを直接渡すのはなぜですか? –

+0

どのような形式で渡す必要がありますか。可能であれば例を挙げてください –

0

問題は、あなたのSearchListProviderクラスがSerializableを実装していることですが、Placeオブジェクトは、場所オブジェクトはシリアライズされ得るので、nullでない理由であることSerializableを実装していません。

これで、場所オブジェクトからSearchListProviderオブジェクトに必要なフィールドだけを追加することで、この問題を回避できます。以前の私はそれだけではなく、その後も同じエラーをしようとしていた

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

       final AutocompletePrediction item = mAdapter.getItem(position); 
       if (item != null) { 
        final CharSequence primaryText = item.getFullText(null); 
        locationAutoComplete.setText(primaryText); 
        final String placeId = item.getPlaceId(); 


        PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
          .getPlaceById(client, placeId); 
        placeResult.setResultCallback(mUpdatePlaceDetailsCallback); 
       } 
      } 
     }); 
+0

シリアライズ可能なものを置かないと、オブジェクトを渡すことができません。 –

+0

latLngオブジェクトを場所から取り出したい場合は、latLngオブジェクトがparcelableを実装しているため、パーセル可能な実装が可能です。putParcelable()を単に実行することができます –

+0

私はあなたにオブジェクトが何も与えていないと言っています。編集を確認してください –

関連する問題