如何在Android Studio的Recyclerview中显示从API获取的JPG图像? [英] How can I display a JPG image, taken from an API, in a Recyclerview in Android Studio?

查看:78
本文介绍了如何在Android Studio的Recyclerview中显示从API获取的JPG图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

图像正在RecipeApiActivity中下载-我可以在名为"imigiview"的测试ImageView中看到它们,因此API请求有效!但是我希望它们在recyclerview中正确显示-现在它什么也没有显示.
为此,我创建了一个位图列表,在其中放置了所有下载的位图,此列表提供给RecipeAPIAdapter,应将其放置在RecyclerView中.
您能帮我找出为什么未显示图像吗? (Logcat不会给我任何错误)

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

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

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

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>

推荐答案

对于迄今为止的图像加载,最简单的方法是使用滑行.

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 :)

这篇关于如何在Android Studio的Recyclerview中显示从API获取的JPG图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆