Добавлены элементы из списка api мест / фотографий в представление переработчика, и представление пустое - PullRequest
0 голосов
/ 23 марта 2019

Я работаю над приложением, которое требует от меня получения информации, такой как Название места и Фотография PLACE, от google PLaces Api и установки ее в RecyclerView. Я застрял, потому что мне удалось заставить код работать без ошибок, но RecyclerView пуст. Что не так с моим кодом?

Я застрял, потому что не знаю, в чем проблема. Когда я запускаю код, все выборки работают, и теги появляются в журнале, поэтому я полностью теряюсь. Моя первая мысль - я неправильно показываю код, но у меня нет возможности сделать шаг вперед и изменить его на что-то другое, потому что я не уверен, будет ли он лучше или хуже.

This is the Fragment for the RecyclerView Item:

public class VenueList extends Fragment{
ArrayList<VenueItem> vIL = new ArrayList<>();
private PlacesClient placesClient;
private Context contextForPlaces;

идентификаторы мест для мест, которые я сейчас использую

    String[] clubs = {"ChIJO_uSYKNZwokRAC7RLeB0oZ8", "ChIJAQBEylJYwokRLbnrAchQImk",
        "ChIJU_26rfpYwokRTNf2K1-7p8E", "ChIJ38hxfnhZwokRx1HSFLj790w", "ChIJBwnlGrdZwokRpf61pMm860c"
        , "ChIJpSIzqrhZwokR1KnVMoVty_g", "ChIJMRV7375ZwokRAfltF6Y-wYw", "ChIJYabdHPhYwokRPmAV8GtM3gs",
        "ChIJi2dSjQRZwokRuXUKcv4riVc", "ChIJKaKVI79ZwokRN8WicODOIAw", "ChIJwXI8Fb5ZwokRr4JjG4HxSP8",
        "ChIJ6bU_E4ZZwokR2ZDbY_IhhrI"};

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    contextForPlaces = context;
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.menu_venue, container, false);
    RecyclerView vRV = view.findViewById(R.id.view_venue);
    List<Place.Field> placeFields = Arrays.asList(Place.Field.NAME, Place.Field.PHOTO_METADATAS);
    if (!Places.isInitialized()) {
        Places.initialize(contextForPlaces, "AIzaSyCKGd3fqmtsDklRGMhnkuIy1GS-j6gRBh8");}
    placesClient = Places.createClient(contextForPlaces);


    vRV.setHasFixedSize(true);
    RecyclerView.LayoutManager vLM = new LinearLayoutManager(this.getActivity());
    RecyclerView.Adapter vAdapter = new VenueAdapter(vIL);

    // run through each photo to make sure it has a place attached to it then insert each photo and place into the vIL
    //createBitmap for fetchPhoto
    for (String club : clubs) {
        FetchPlaceRequest request = FetchPlaceRequest.newInstance(club, placeFields);
        placesClient.fetchPlace(request).addOnSuccessListener((response) -> {
            Place place = response.getPlace();
            PhotoMetadata photoMetadata = place.getPhotoMetadatas().get(0);
            String attributions = photoMetadata.getAttributions();
            FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata).setMaxHeight(200).build();
            placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> {
                Bitmap bitmap = fetchPhotoResponse.getBitmap();
                vIL.add(new VenueItem(/*Photo*/bitmap, place/*Name*/));
                Log.i(TAG, "Photo Should Be Up: ");

            }).addOnFailureListener((exception) -> {
                if (exception instanceof ApiException) {
                    ApiException apiException = (ApiException) exception;
                    int statusCode = apiException.getStatusCode();
                    // Handle error with given status code.
                    Log.e(TAG, "Place not found: " + exception.getMessage());
                }
            });

            Log.i(TAG, "Place found: " + place.getName());
        }).addOnFailureListener((exception) -> {
            if (exception instanceof ApiException) {
                ApiException apiException = (ApiException) exception;
                int statusCode = apiException.getStatusCode();
                // Handle error with given status code.
                Log.e(TAG, "Place not found: " + exception.getMessage());
            }
        });


    }
    vRV.setLayoutManager(vLM);
    vRV.setAdapter(vAdapter);

    return view;
}

Это часть адаптера RecyclerView, которую я изменил. Раньше я получал getResourse для изображения, потому что изображение было из папки Drawable

public void onBindViewHolder(@NonNull VenueViewHolder venueViewHolder, int i) {
    VenueItem currentItem = vIAL.get(i);
    if(currentItem.getVenueImageResource() == null){
        venueViewHolder.vIV.setImageResource(R.drawable.ic_android);
    }else
    venueViewHolder.vIV.setImageBitmap(currentItem.getVenueImageResource());
    venueViewHolder.vTV.setText((CharSequence) currentItem.getVenueDescription());
}

Сам предмет, который мне тоже пришлось немного изменить по сравнению с оригиналом. Я сделал строку Поместить, а int - Растровое изображение. Я думал, что это сработает.

public class VenueItem {
private Bitmap venueImageResource;
private Place venueDescription;

public VenueItem(Bitmap vIR, Place description) {
    venueImageResource = vIR;
    venueDescription = description;
}

public Bitmap getVenueImageResource() {
    return venueImageResource;
}

public Place getVenueDescription() {
    return venueDescription;
}
}

Я хочу иметь возможность запрашивать название места и фотографию этого места, используя placeClient, и ставить его в префикс RecyclerView. Я знаю, что идентификаторы мест верны, потому что журнал возвращает названия всех мест. Но они не отображаются в RecyclerView

1 Ответ

0 голосов
/ 24 марта 2019

Я сам разобрался с ответом.

vRV.setLayoutManager (VLM); vRV.setAdapter (vAdapter);

Мне просто нужно было поместить эти две строки в цикл for под элементом списка, чтобы каждый элемент мог сбежать до того, как стирается моя информация

...