如何在Android Studio的Recyclerview中显示从API获取的JPG图像? [英] How can I display a JPG image, taken from an API, in a Recyclerview in Android Studio?
问题描述
图像正在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屋!