我从api收到了一个项目

ykejflvf  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(486)

我试图在recyclerview中显示来自api响应的温度值。问题是我的程序经常只显示一个,第一项。我不确定问题出在哪里,我有点迷失了方向。
我想显示的部分api响应

  1. "hourly": [
  2. {
  3. "dt": 1607184000,
  4. "temp": x,
  5. "feels_like": x,
  6. "pressure": x,
  7. "humidity": x,
  8. "dew_point": x,
  9. "uvi": x,
  10. "clouds": x,
  11. "visibility": x,
  12. "wind_speed": x,
  13. "wind_deg": x,
  14. "pop": x
  15. },
  16. and so on...

模型类

  1. public class ForecastModel {
  2. @SerializedName("hourly")
  3. private List<HourlyForecast> hourlyForecast = null;
  4. public List<HourlyForecast> getHourlyForecast() {
  5. return hourlyForecast;
  6. }
  7. public class HourlyForecast{
  8. @SerializedName("dt")
  9. private int dt;
  10. public int getDt() {
  11. return dt;
  12. }
  13. }

}
活动类

  1. public class HourlyForecastActivity extends AppCompatActivity {
  2. private static final String TAG = "HourlyForecastActivity";
  3. private List<ForecastModel> mData = new ArrayList<>();
  4. RecyclerView recyclerView;
  5. HourlyForecastAdapter adapter;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_hourly_forecast);
  10. recyclerView = findViewById(R.id.hourly_recycler_view);
  11. adapter = new HourlyForecastAdapter();
  12. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  13. recyclerView.setHasFixedSize(true);
  14. recyclerView.setAdapter(adapter);
  15. prepareConnection();
  16. }
  17. private void prepareConnection(){
  18. ForecastViewModel viewModel = new ViewModelProvider(this).get(ForecastViewModel.class);
  19. viewModel.getData().observe(this, new Observer<ForecastModel>() {
  20. @Override
  21. public void onChanged(ForecastModel forecast) {
  22. if (mData.size() > 0){
  23. mData.clear();
  24. }
  25. if (forecast != null){
  26. mData.addAll(Collections.singleton(forecast));
  27. adapter.setData(mData);
  28. }
  29. }
  30. });
  31. }
  32. }

适配器类

  1. public class HourlyForecastAdapter extends RecyclerView.Adapter<HourlyForecastAdapter.HourlyViewHolder> {
  2. private List<ForecastModel> mHourlyData = new ArrayList<>();
  3. public void setData(List<ForecastModel> mHourlyData){
  4. this.mHourlyData = mHourlyData;
  5. notifyDataSetChanged();
  6. }
  7. @NonNull
  8. @Override
  9. public HourlyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  10. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_items, parent, false);
  11. return new HourlyViewHolder(view);
  12. }
  13. @Override
  14. public void onBindViewHolder(@NonNull HourlyViewHolder holder, int position) {
  15. ForecastModel model = mHourlyData.get(position);
  16. holder.mTemperature.setText(String.valueOf(model.getHourlyForecast().get(position).getDt()));
  17. }
  18. @Override
  19. public int getItemCount() {
  20. return mHourlyData.size();
  21. }
  22. public class HourlyViewHolder extends RecyclerView.ViewHolder {
  23. private TextView mTemperature, mPressure, mHumidity, mWindSpeed, mDescription;
  24. private ImageView mIcon;
  25. public HourlyViewHolder(@NonNull View itemView) {
  26. super(itemView);
  27. mTemperature = itemView.findViewById(R.id.hourly_temperature);
  28. mPressure = itemView.findViewById(R.id.hourly_pressure);
  29. mHumidity = itemView.findViewById(R.id.hourly_humidity);
  30. mWindSpeed = itemView.findViewById(R.id.hourly_wind_speed);
  31. mDescription = itemView.findViewById(R.id.hourly_description);
  32. }
  33. }
  34. }
5anewei6

5anewei61#

这个 setData 适配器中的方法有点误导(命名和变量方面)。看着你的 onChanged 中的方法 Activity :单个 ForecastModel 对象是您正在使用的对象。将该对象传递给中的适配器 setData 作为一个 List 命名 mHourlyData 是什么导致了最初的混乱。那个 List 将始终是大小1,导致你所面临的问题。
我建议你换个房间 onChanged 方法调用以简单地执行此操作:

  1. adapter.setData(forecast)

并在中重命名适配器变量 setData 要反映您实际收到(想要收到)的内容:

  1. private List<HourlyForecast> mHourlyForecast = new ArrayList<>();
  2. public void setData(ForecastModel forecast){
  3. this.mHourlyForecast = forecast.hourlyForecast;
  4. notifyDataSetChanged();
  5. }

在那之后,唯一要做的就是更新你的 getItemCount 以及 onBindViewHolder 方法。

相关问题