How can I display a JPG image, taken from an API, in a Recyclerview in Android Studio?

不想你离开。 提交于 2020-06-29 05:23:09

问题


The images are being downloaded in RecipeApiActivity - I can see them in a test ImageView called 'imigiview', so the API Request works! But I want them to be displayed correctly in a recyclerview - now it shows nothing at all.
For that I created a list of Bitmaps in which I put all the downloaded bitmaps, this list is given to the RecipeAPIAdapter that should place them in the RecyclerView.
Can you help me find out why the images are not shown? ( The Logcat gives me no error of any kind)

package byDragosT.myapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Map;
// Aceasta activitate detine o lista de retete gasita pe spoontacular bagata in recyclerview//
// Va lua un RecipeItem si il va baga in RecipeApiAdapter si apoi il conecteaza la recyclerview

public class RecipeAPIActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecipeApiAdapter adapter;
    // private TextView jsonUnparsedResult;
    private ImageView imigiView;
    private ArrayList<Bitmap> images = new ArrayList<>(8);
    private Context context;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recipe_api);

        String url1 = "flour";   // just for simplifying the stackOverflow question I put this value here
        String url2 = "egg";     // just for simplifying the stackOverflow question I put this value here
        String url3 = "salt";    // just for simplifying the stackOverflow question I put this value here

        String urlfinal = "https://spoonacular-recipe-food-nutrition-v1.p.rapidapi.com/recipes/findByIngredients?number=5&ranking=1&ignorePantry=false&ingredients=" + url1 + url2 + url3;
        System.out.println(urlfinal);

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(urlfinal)
                .get()
                .addHeader("x-rapidapi-host", "spoonacular-recipe-food-nutrition-v1.p.rapidapi.com")
                .addHeader("x-rapidapi-key", "key hidden") 
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                e.printStackTrace();
            }

            @Override
            public void onResponse(final Response response) throws IOException {
                if (response.isSuccessful()){
                    //Aici inca suntem pe background thread - metoda enqueue -- //
                    final String myResponse;
                    myResponse = response.body().string();
                    // Aici trecem pe threadul principal din nou //
                    RecipeAPIActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // jsonUnparsedResult.setText(myResponse);
                            System.out.println(myResponse);
                            try {
                                JSONArray results = new JSONArray(myResponse);
                                if(results.length() > 0){
                                    for (int i = 0; i < results.length(); i++){
                                        JSONObject object = results.getJSONObject(i);
                                        // jsonUnparsedResult.setText(object.getString("title"));
                                        System.out.println(object.getString("image"));
                                        // SPRITES
                                        String imgUrl = object.getString("image");    //  aici sprites e Obiect cu 8 perechi key-values
                                        new DownloadSpriteTask().execute(imgUrl);
                                    }
                                }
                            } catch (JSONException e) { e.printStackTrace(); }
                        }
                    });
                }
            }
        });

        imigiView = findViewById(R.id.imaginedetest); // on post execute at Asynktask
        recyclerView = findViewById(R.id.recyclerView);
        layoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(layoutManager);
        // System.out.println("ce se intampla" + images);
        adapter = new RecipeApiAdapter(images);
        recyclerView.setAdapter(adapter);
        // jsonUnparsedResult = findViewById(R.id.JsonExample);
    }

    private class DownloadSpriteTask extends AsyncTask<String, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(String... strings) {
            try {
                URL url = new URL(strings[0]);
                return BitmapFactory.decodeStream(url.openStream());
            } catch (IOException e) {
                Log.e("cs50", "Download sprite error", e);
                return null;
            }
        }
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            imigiView.setImageBitmap(bitmap);
            images.add(bitmap);       /// images e facut sa ia int ca valoare nu Bitmap
            System.out.println("Another photo attached!");
        }
    }

    /// Ingredients should be comma separated ////   symbol for ',' is %252C
    //// symbol for space ' ' is %20   //
    public String urlify (String ingredient, String vitamina){
        String theUrl = "";
        if (ingredient.equals("Choose a " + vitamina + " ingredient")){
            System.out.println("VA RUGAM sa introduceti ceva ok !!!!!!!!!!");
            ingredient = "";
        }else{
            String[] splitResult = ingredient.split(" ",8);
            for (String word:splitResult){
                if (word.equals("-")){
                    theUrl = theUrl + "%252C";
                    break;
                }else theUrl = theUrl + word + "%20";
            }
        }
        return theUrl;
    }
}

RecipeAPIAdapter

package byDragosT.myapplication;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;

public class RecipeApiAdapter extends RecyclerView.Adapter<RecipeApiAdapter.RecipeViewHolder> {
    private ArrayList<Bitmap> images;

    public RecipeApiAdapter(ArrayList<Bitmap> images){
        this.images = images;
    }
    public static class RecipeViewHolder extends RecyclerView.ViewHolder {
        public ImageView pozaReteta;
        public TextView titlu;
        public TextView descriere;

        RecipeViewHolder(View view){
            super(view);
            pozaReteta = view.findViewById(R.id.poza);
            titlu = view.findViewById(R.id.recipe_name);
            descriere = view.findViewById(R.id.ingredients_list);
        }
    }
    @NonNull
    @Override    //// Mare grija ce layout pui aici - sfat pentru viitor - mi-a luat 4 ore sa gasesc eroarea
    public RecipeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recipe_item_in_recyclerview_api, parent, false);
        RecipeViewHolder recipeViewHolder = new RecipeViewHolder(view);
        return recipeViewHolder;
    }
    @Override
    public void onBindViewHolder(@NonNull RecipeViewHolder holder, int position) {
        Bitmap image_id = images.get(position);
        holder.pozaReteta.setImageBitmap(image_id);
        holder.titlu.setText("Image: "+ position);
    }
    @Override
    public int getItemCount() {
        return images.size();
    }
}

activity_recipe_api.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RecipeAPIActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical" />

    <TextView
        android:id="@+id/JsonExample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentBottom="true"
        android:layout_marginEnd="150dp"
        android:layout_marginBottom="8dp"
        android:text="Testing testing 123"
        android:background="@color/colorPrimaryDark"
        android:textColor="@android:color/background_light"
        app:layout_constraintStart_toEndOf="@+id/recyclerView" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imaginedetest"
        android:contentDescription="@string/imagine_de_test" />

</RelativeLayout>

recipe_item_in_recyclerview_api.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <ImageView
        android:id="@+id/poza"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginTop="4dp"
        android:layout_marginEnd="2dp"
        android:paddingTop="10dp"
        app:layout_constraintEnd_toStartOf="@+id/ingredients_list"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:srcCompat="@android:drawable/sym_def_app_icon" />

    <TextView
        android:id="@+id/recipe_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:text="@string/mankarika_super"
        android:textAlignment="center"
        android:textSize="18sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.52"
        app:layout_constraintStart_toEndOf="@+id/poza"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/ingredients_list"
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:paddingTop="5dp"
        android:text="Se face din: ceapa, apa, si multe multe multe multe multe multe multe multe multe multe multe multe chestii"
        android:textAlignment="gravity"
        android:textSize="12sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/poza"
        app:layout_constraintTop_toBottomOf="@+id/recipe_name" />

</androidx.constraintlayout.widget.ConstraintLayout>

回答1:


For image loading by far the easiest is using either Picasso or Glide.

Honestly, I have no idea how to do it without using those libs :)



来源:https://stackoverflow.com/questions/62300736/how-can-i-display-a-jpg-image-taken-from-an-api-in-a-recyclerview-in-android-s

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!