【问题标题】:how to display image of nearby caffe with name in a list如何在列表中显示附近有名字的咖啡的图像
【发布时间】:2017-10-02 11:44:38
【问题描述】:

我想显示附近咖啡店的名称和图片列表。这是我的代码

public class ViewAdapter extends BaseAdapter{
    Context context;
    private List<GetterAndSetter> items;
    private LayoutInflater inflater;
    ViewHolder viewHolder;

    private GoogleApiClient mApiClient;

    public ViewAdapter(Context context, List<GetterAndSetter> listItem){
        this.context = context;
        this.items = listItem;
    }

    public  class ViewHolder {
        TextView txtPlaceId;
        TextView txtAddress;
        ImageView img;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int position) {
        return items.get(position);
    }

    @Override
    public long getItemId(int position) {
        return items.indexOf(getItem(position));
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (inflater == null){
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        final GetterAndSetter item =items.get(position);

        if (convertView == null){
            convertView= inflater.inflate(R.layout.list_layout,null);
            viewHolder = new ViewAdapter.ViewHolder();
            viewHolder.txtPlaceId = (TextView) convertView.findViewById(R.id.txtPlaceId);
            viewHolder.txtAddress = (TextView) convertView.findViewById(R.id.txtAddress);
            viewHolder.img = (ImageView) convertView.findViewById(R.id.img);

            convertView.setTag(viewHolder);
            convertView.setTag(R.id.txtPlaceId, viewHolder.txtPlaceId);
            convertView.setTag(R.id.txtAddress, viewHolder.txtAddress);
            convertView.setTag(R.id.img, viewHolder.img);
        }else {
            viewHolder = (ViewAdapter.ViewHolder) convertView.getTag();
        }
        String PlaceName = items.get(position).getPlaceName();
        viewHolder.txtPlaceId.setText(items.get(position).getPlace_Id()+"\n"+PlaceName);
        viewHolder.txtAddress.setText(items.get(position).getAddress());

       // String PlaceId ="ChIJF1un_5LBwjsR0AdAQM5TGAE";
       // String PlaceId ="ChIJhXQqHPfBwjsR4BzVyYVZ31c";
       // String PlaceId ="ChIJhXQqHPfBwjsR4BzVyYVZ31c";
        Log.d("placeID",items.get(position).getPlace_Id());



        final Task<PlacePhotoMetadataResponse> photoMetadataResponse = mGeoDataClient.getPlacePhotos(items.get(position).getPlace_Id());
        photoMetadataResponse.addOnCompleteListener(new OnCompleteListener<PlacePhotoMetadataResponse>() {
            @Override
            public void onComplete(@NonNull Task<PlacePhotoMetadataResponse> task) {
                // Get the list of photos.
                PlacePhotoMetadataResponse photos = task.getResult();
                // Get the PlacePhotoMetadataBuffer (metadata for all of the photos).
                PlacePhotoMetadataBuffer photoMetadataBuffer = photos.getPhotoMetadata();
                // Get the first photo in the list.
                PlacePhotoMetadata photoMetadata = photoMetadataBuffer.get(0);
                Log.d("photos", String.valueOf(photoMetadata));
                // Get the attribution text.
                CharSequence attribution = photoMetadata.getAttributions();
                // Get a full-size bitmap for the photo.
                Task<PlacePhotoResponse> photoResponse = mGeoDataClient.getPhoto(photoMetadata);
                photoResponse.addOnCompleteListener(new OnCompleteListener<PlacePhotoResponse>() {
                    @Override
                    public void onComplete(@NonNull Task<PlacePhotoResponse> task) {
                        PlacePhotoResponse photo = task.getResult();
                        Bitmap bitmap = photo.getBitmap();
                        viewHolder.img.setImageBitmap(bitmap);
                    }
                });
            }
        });
        return convertView;
    }
} 

但出现错误。

E/AndroidRuntime: 致命异常: main 进程:com.example.rohit.gayatri,PID:18853 java.lang.IllegalStateException 在 com.google.android.gms.common.internal.zzbp.zzbg(未知来源) 在 com.google.android.gms.common.data.zzc.zzbu(未知来源) 在 com.google.android.gms.common.data.zzc.(未知来源) 在 com.google.android.gms.location.places.internal.zzav.(未知 资源) 在 com.google.android.gms.location.places.internal.zzar.(未知 资源) 在 com.google.android.gms.location.places.PlacePhotoMetadataBuffer.get(未知 资源) 在 com.example.rohit.gayatri.PlacePhoto$ViewAdapter$1.onComplete(PlacePhoto.java:313) 在 com.google.android.gms.tasks.zzf.run(未知来源) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5343) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

感谢任何形式的帮助。

【问题讨论】:

  • 请添加您的 AndroidManifest.xml
  • 应该定义您的 GoogleApiClient 变量。
  • 异常似乎是由这个调用引起的:photoMetadataBuffer.get(0) 但我不知道为什么,因为文档没有提到get 方法可以抛出这种异常。

标签: java android google-api google-places-api android-image


【解决方案1】:

你好朋友我得到了我的问题的解决方案。 我稍微修改一下代码。

new AsyncTask<Void,Void,Void>(){
            Bitmap image;
            @Override
            protected Void doInBackground(Void... params) {

                PlacePhotoMetadataResult result = Places.GeoDataApi.getPlacePhotos(mGoogleApiClient, items.get(position).getPlace_Id()).await();
                if (result.getStatus().isSuccess()) {
                    PlacePhotoMetadataBuffer photoMetadataBuffer = result.getPhotoMetadata();
                    if (photoMetadataBuffer.getCount() > 0) {
                        PlacePhotoMetadata photo = photoMetadataBuffer.get(0);
                        CharSequence attribution = photo.getAttributions();
                        image = photo.getScaledPhoto(mGoogleApiClient, 200, 200).await()
                                .getBitmap();

                        Log.d("Bitmap", String.valueOf(image));

                       // viewHolder.img.setImageBitmap(image);
                    }
                    photoMetadataBuffer.release();
                }
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                viewHolder.img.setImageBitmap(image);

                super.onPostExecute(aVoid);
            }
        }.execute();

如果有人知道更好的解决方案,请发布。

【讨论】:

    【解决方案2】:

    这条线正确吗? PlacePhotoMetadataBuffer photoMetadataBuffer = photos.getPhotoMetadata(); 我想应该是List&lt;PlacePhotoMetadataBuffer&gt; photoMetadataBuffer = photos.getPhotoMetadata(); 正如你所提到的,这是一个列表!!!! 并且还要检查 nullPointerExceptoins。 if(photoMetadataBuffer.size()>0){ //do the rest }

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2015-12-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多