partizal
partizal

Reputation: 33

How can I show image in Recyclerview - Recyclerview image display error

Firstly sorry if my english explanation is bad. My issue is, I am trying to make weather app and I want to show 5 day forecast.I keep the data in arraylist that I pull in api and send to my adapter class. As you know weahter icons are expressed as string in weather api. such as "010d" is sunny something like that.I am going to show recyclerview that I wrote 5 day forecast. Everything is working but icons doesn't show. I am sharing codes that I did.

I am getting data in forecast class My forecast class

 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());
}

 }

My adapter class

 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;
    }
}


 }

I have tried to write icons in onbindviewholder without load_weather_icon() funct and it hasn't worked

My 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_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="100"
android:background="#FA8072"
<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    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_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        >
        <TextView
            android:id="@+id/txt_recyclerview_day"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="day:"
            android:textColor="@color/white"
            ></TextView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        >
        <TextView
            android:id="@+id/txt_recyclerview_temp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="temp:"
            android:textColor="@color/white"
            ></TextView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        >

        <TextView
            android:id="@+id/txt_recyclerview_feelslike"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="feels like:"
            android:textColor="@color/white"></TextView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <TextView
            android:id="@+id/txt_recyclerview_pressure"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="pressure:"
            android:textColor="@color/white"></TextView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <TextView
            android:id="@+id/txt_recyclerview_humidity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="humidity:"
            android:textColor="@color/white"></TextView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp">

        <TextView
            android:id="@+id/txt_recyclerview_wind_speed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="wind speed:"
            android:textColor="@color/white"></TextView>
    </LinearLayout>

</LinearLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    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_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:layout_alignParentTop="true"
        android:layout_centerInParent="true"
        ></ImageView>

   <TextView
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       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

Upvotes: 1

Views: 101

Answers (1)

Manjeet deswal
Manjeet deswal

Reputation: 785

  • Use Glide or Picasso library

  • They are best in these type of Application

Upvotes: 1

Related Questions