如何在 Recyclerview 中显示图像 - Recyclerview 图像显示错误
Posted
技术标签:
【中文标题】如何在 Recyclerview 中显示图像 - Recyclerview 图像显示错误【英文标题】:How can I show image in Recyclerview - Recyclerview image display error 【发布时间】:2021-12-11 21:14:52 【问题描述】:首先抱歉,如果我的英文解释不好。我的问题是,我正在尝试制作天气应用程序,并且我想显示 5 天的预报。我将数据保存在我拉入 api 并发送到我的适配器类的数组列表中。如您所知,天气图标在天气 api 中表示为字符串。比如“010d”是晴天之类的。我要展示我写的5天预测的recyclerview。一切正常,但图标不显示。我正在分享我所做的代码。
我在预测类中获取数据 我的预测课
public class forecast extends AppCompatActivity
ActivityResultLauncher<String> permissionLauncher;
LocationManager locationManager;
LocationListener locationListener;
ImageView forecast_back_icon;
RecyclerView recyclerviewforecast;
String API_KEY_FORECAST;
String URL_FORECAST;
Double Latitude,Longitude;
ArrayList<RecyclerviewModel> arrayList;
ForecastAdapter forecastAdapter;
public forecast()
super();
public void init()
arrayList = new ArrayList<>();
forecast_back_icon = findViewById(R.id.forecast_back_icon);
recyclerviewforecast = findViewById(R.id.RecyclerviewForecast);
get_forecast_data(Latitude,Longitude);
forecast_back_icon();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_forecast);
Intent intent = getIntent();
Latitude = intent.getDoubleExtra("lat",0);
Longitude = intent.getDoubleExtra("long",0);
System.out.println("LATİTUDE "+Latitude+" Longitude "+Longitude);
init();
public void forecast_back_icon()
forecast_back_icon.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
Intent IntentForecastToMain = new Intent(forecast.this,MainActivity.class);
startActivity(IntentForecastToMain);
);
public void get_forecast_data(Double Lat, Double Long)
//EXAMPLE URL
//https://api.openweathermap.org/data/2.5/weather?lat=lat&lon=lon&appid=API%20key
API_KEY_FORECAST = "c29ecfafd4a70caad8fee38d6054bfc7";
URL_FORECAST = "https://api.openweathermap.org/data/2.5/onecall?lat="+Lat+"&lon="+Long+"&exclude=current,minutely,hourly,alerts&appid="+API_KEY_FORECAST;
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, URL_FORECAST, null, new Response.Listener<JSONObject>()
@Override
public void onResponse(JSONObject response)
try
JSONArray daily = response.getJSONArray("daily");
for(int i=0;i<daily.length();i++)
String temp = daily.getJSONObject(i).getJSONObject("temp").getString("day");
String feels_like = daily.getJSONObject(i).getJSONObject("feels_like").getString("day");
String pressure = daily.getJSONObject(i).getString("pressure");
String humidity = daily.getJSONObject(i).getString("humidity");
String wind_speed = daily.getJSONObject(i).getString("wind_speed");
String icon = daily.getJSONObject(i).getJSONArray("weather").getJSONObject(0).getString("icon");
String description = daily.getJSONObject(i).getJSONArray("weather").getJSONObject(0).getString("description");
arrayList.add(new RecyclerviewModel(temp,humidity,feels_like,pressure,description,wind_speed,icon));
catch (JSONException e)
e.printStackTrace();
forecastAdapter = new ForecastAdapter(arrayList);
recyclerviewforecast.setAdapter(forecastAdapter);
recyclerviewforecast.setLayoutManager(new LinearLayoutManager(forecast.this));
, new Response.ErrorListener()
@Override
public void onErrorResponse(VolleyError error)
error.printStackTrace();
);
queue.add(request);
System.out.println("forecast class arraylist size : --> "+arrayList.size());
我的适配器类
public class ForecastAdapter extends RecyclerView.Adapter<ForecastAdapter.MyForecastViewHolder>
ArrayList<RecyclerviewModel> ForecastArraylist;
ForecastDailyIconConverter forecastDailyIconConverter;
public ForecastAdapter(ArrayList<RecyclerviewModel> ForecastArraylist)
this.ForecastArraylist = ForecastArraylist;
System.out.println("ForecastAdapter arraylist size : --- > "+ForecastArraylist.size());
@NonNull
@Override
public MyForecastViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
RecyclerviewForecastRowBinding recyclerviewForecastRowBinding = RecyclerviewForecastRowBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new MyForecastViewHolder(recyclerviewForecastRowBinding);
@Override
public void onBindViewHolder(@NonNull MyForecastViewHolder holder, int position)
System.out.println("we are in onbindviewholder.... ");
Double temperature = Double.parseDouble(ForecastArraylist.get(position).getTemperature()) - 273.15;
System.out.println(temperature);
Double feels_like = Double.parseDouble(ForecastArraylist.get(position).getFeels_like()) - 273.15;
holder.binding.txtRecyclerviewDay.setText("day "+(position+1));
holder.binding.txtRecyclerviewTemp.setText("temperature:"+temperature.toString().substring(0,4)+"°");
holder.binding.txtRecyclerviewFeelslike.setText("feels like:"+feels_like.toString().substring(0,4)+"°");
holder.binding.txtRecyclerviewHumidity.setText("humidity:%"+ForecastArraylist.get(position).getHumadity());
holder.binding.txtRecyclerviewPressure.setText("pressure:"+ForecastArraylist.get(position).getPressure()+"hPa");
holder.binding.txtRecyclerviewWindSpeed.setText("wind speed:"+ForecastArraylist.get(position).getWind_speed()+"km/h");
holder.binding.txtRecyclerviewCloud.setText(ForecastArraylist.get(position).getDescription());
String icon_id = ForecastArraylist.get(position).getId();
forecastDailyIconConverter = new ForecastDailyIconConverter();
int id1 = forecastDailyIconConverter.ConvertIntoNumeric(icon_id);
load_weather_icon(id1,holder);
public void load_weather_icon(int id1,MyForecastViewHolder holder)
if(id1>=200 && id1 <= 232)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.thunderstorm);
else if(id1>=300 && id1<= 321)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.showerrain);
else if(id1>=500 && id1<= 504)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.rain);
else if(id1 == 511)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.snow);
else if(id1>=520 && id1<= 531)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.showerrain);
else if(id1>=600 && id1<= 622)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.snow);
else if(id1>=701 && id1<= 781)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.mist);
else if(id1 == 800 )
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.clearsky);
else if(id1 == 801)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.fewclouds);
else if(id1 == 802)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.scatteredclouds);
else if(id1 == 803)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.brokenclouds);
else if(id1 == 804)
holder.binding.recyclerviewCloudImg.setBackgroundResource(R.drawable.brokenclouds);
@Override
public int getItemCount()
return ForecastArraylist.size();
public class MyForecastViewHolder extends RecyclerView.ViewHolder
private RecyclerviewForecastRowBinding binding;
public MyForecastViewHolder(@NonNull RecyclerviewForecastRowBinding binding)
super(binding.getRoot());
this.binding = binding;
我尝试在没有 load_weather_icon() 函数的情况下在 onbindviewholder 中编写图标,但没有成功
我的 recyclerview_row xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_
android:layout_
android:orientation="horizontal"
android:weightSum="100"
android:background="#FA8072"
<LinearLayout
android:layout_
android:layout_
android:layout_margin="5dp"
android:orientation="vertical"
android:padding="5dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_weight="40"
>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp"
>
<TextView
android:id="@+id/txt_recyclerview_day"
android:layout_
android:layout_
android:text="day:"
android:textColor="@color/white"
></TextView>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp"
>
<TextView
android:id="@+id/txt_recyclerview_temp"
android:layout_
android:layout_
android:text="temp:"
android:textColor="@color/white"
></TextView>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp"
>
<TextView
android:id="@+id/txt_recyclerview_feelslike"
android:layout_
android:layout_
android:text="feels like:"
android:textColor="@color/white"></TextView>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp">
<TextView
android:id="@+id/txt_recyclerview_pressure"
android:layout_
android:layout_
android:text="pressure:"
android:textColor="@color/white"></TextView>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp">
<TextView
android:id="@+id/txt_recyclerview_humidity"
android:layout_
android:layout_
android:text="humidity:"
android:textColor="@color/white"></TextView>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:padding="5dp">
<TextView
android:id="@+id/txt_recyclerview_wind_speed"
android:layout_
android:layout_
android:text="wind speed:"
android:textColor="@color/white"></TextView>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_
android:layout_
android:layout_weight="60"
android:layout_margin="5dp"
android:padding="5dp"
android:gravity="right"
android:orientation="vertical"
>
<ImageView
android:id="@+id/recyclerview_cloud_img"
android:layout_
android:layout_
android:layout_margin="5dp"
android:layout_alignParentTop="true"
android:layout_centerInParent="true"
></ImageView>
<TextView
android:layout_
android:layout_
android:id="@+id/txt_recyclerview_cloud"
android:text=""
android:gravity="center"
android:layout_margin="5dp"
android:padding="5dp"
android:textColor="@color/white"
></TextView>
</LinearLayout>
enter image description here
【问题讨论】:
【参考方案1】:使用Glide 或Picasso 库
它们最适合这类应用程序
【讨论】:
我要试试。谢谢你。你有别的建议吗?你觉得哪个更好用。 我更喜欢 glide lib 对不起,这是我的错。字符串值来自像“10d”这样的api,但我在if中检查了我的适配器类的整数值,例如500,600。我修复了它们并且它起作用了。我试过你说的滑翔。它也有效。谢谢你 不客气。很高兴为您提供帮助以上是关于如何在 Recyclerview 中显示图像 - Recyclerview 图像显示错误的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中显示来自 RecyclerView 的全屏图像?
无法在 Recyclerview 中显示图像 - 文本已成功显示
Android:在 Recyclerview 中更改图像旋转