簡體   English   中英

Recyclerview 適配器錯誤:Android Studio 中的 Arraylist 大小為零

[英]Recyclerview adapter error: Arraylist size zero in Android studio

首先很抱歉我的英語不好。 我的問題是,我正在嘗試使用 Wea​​ther API 制作一個 Weather 應用程序。 我想使用 recyclerview 適配器顯示 5 天的預測。 我將數據添加到 arraylist,這是我從 API 獲得的,它應該轉到我的適配器類。 它需要在那里顯示添加到 arraylist 的數據,但它沒有並且 arraylist 大小始終為零。

我的 recyclerview 類是預測的

oncreate

@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);//i just experimented to 
                                                                         check if latitude and 
                                                                         longitude come
    init();

}

在里面()

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


    forecastAdapter = new ForecastAdapter(arrayList);
    recyclerviewforecast.setAdapter(forecastAdapter);
    recyclerviewforecast.setLayoutManager(new LinearLayoutManager(forecast.this));

    forecast_back_icon();

}

get_forecast_data() 函數

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

            }
        }

    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

            error.printStackTrace();
        }
    });
    queue.add(request);
    System.out.println("forecast class arraylist size : --> "+arrayList.size());
}

當我在底部檢查時,arraylist 的大小為零

我的預測適配器類

 public class ForecastAdapter extends RecyclerView.Adapter<ForecastAdapter.MyForecastViewHolder> {

ArrayList<RecyclerviewModel> ForecastArraylist;


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.txtRecyclerviewTemp.setText(temperature.toString().substring(0,4)+"°");
    holder.binding.txtRecyclerviewFeelslike.setText(feels_like.toString().substring(0,4)+"°");
    holder.binding.txtRecyclerviewHumidity.setText("%"+ForecastArraylist.get(position).getHumadity());
    holder.binding.txtRecyclerviewPressure.setText(ForecastArraylist.get(position).getPressure()+"hPa");
    holder.binding.txtRecyclerviewWindSpeed.setText(ForecastArraylist.get(position).getWind_speed()+"km/h");
    holder.binding.txtRecyclerviewCloud.setText(ForecastArraylist.get(position).getDescription());
    String icon_id = ForecastArraylist.get(position).getId();
    load_weather_icon(icon_id,holder);


}

@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;
    }
}
public void load_weather_icon(String id,MyForecastViewHolder holder ){

    int id1 = Integer.valueOf(id);

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

}

}

我在我的預測適配器中看不到“我們在 onbindviewholder”

預測xml

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".forecast"
android:orientation="vertical"
android:id="@+id/forecastLayout">

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:id="@+id/Toolbarcities">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/toolbarconstraintforecast"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">


        <androidx.appcompat.widget.Toolbar
            android:id="@+id/MyToolbarforecast"
            android:layout_width="match_parent"
            android:layout_height="?actionBarSize"
            android:background="?attr/colorPrimary"
            android:minHeight="?attr/actionBarSize"
            android:theme="?attr/actionBarTheme"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:titleTextColor="@color/white"
            >

            <ImageView
                android:id="@+id/forecast_back_icon"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/cities_back_icon"
                ></ImageView>

        </androidx.appcompat.widget.Toolbar>
    </androidx.constraintlayout.widget.ConstraintLayout>
</com.google.android.material.appbar.AppBarLayout>

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

這里的問題是,在處理 Volley 請求並填充數組列表之前,您已經使用空數組列表創建了適配器並將其分配給 Recyclerview。 有 2 種方法可以解決此問題。 首先是創建適配器並在 Volley 請求的 OnResponse 方法中設置適配器。 或者,您可以在適配器中創建一個方法來更新數組列表並通知適配器數據集已更改。 我希望你能理解這一點。

第一個是最簡單的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM