我收到了来自 api 的单件商品
I've received single item from api
我试图在 RecyclerView 中显示来自 API 响应的温度值。事情是我的程序不断地只显示一个,第一个项目。我不确定问题出在哪里,我觉得有点迷茫。
我要显示的 api 响应的一部分
"hourly": [
{
"dt": 1607184000,
"temp": x,
"feels_like": x,
"pressure": x,
"humidity": x,
"dew_point": x,
"uvi": x,
"clouds": x,
"visibility": x,
"wind_speed": x,
"wind_deg": x,
"pop": x
},
and so on...
型号class
public class ForecastModel {
@SerializedName("hourly")
private List<HourlyForecast> hourlyForecast = null;
public List<HourlyForecast> getHourlyForecast() {
return hourlyForecast;
}
public class HourlyForecast{
@SerializedName("dt")
private int dt;
public int getDt() {
return dt;
}
}
}
Activity class
public class HourlyForecastActivity extends AppCompatActivity {
private static final String TAG = "HourlyForecastActivity";
private List<ForecastModel> mData = new ArrayList<>();
RecyclerView recyclerView;
HourlyForecastAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hourly_forecast);
recyclerView = findViewById(R.id.hourly_recycler_view);
adapter = new HourlyForecastAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
prepareConnection();
}
private void prepareConnection(){
ForecastViewModel viewModel = new ViewModelProvider(this).get(ForecastViewModel.class);
viewModel.getData().observe(this, new Observer<ForecastModel>() {
@Override
public void onChanged(ForecastModel forecast) {
if (mData.size() > 0){
mData.clear();
}
if (forecast != null){
mData.addAll(Collections.singleton(forecast));
adapter.setData(mData);
}
}
});
}
}
适配器class
public class HourlyForecastAdapter extends RecyclerView.Adapter<HourlyForecastAdapter.HourlyViewHolder> {
private List<ForecastModel> mHourlyData = new ArrayList<>();
public void setData(List<ForecastModel> mHourlyData){
this.mHourlyData = mHourlyData;
notifyDataSetChanged();
}
@NonNull
@Override
public HourlyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_items, parent, false);
return new HourlyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull HourlyViewHolder holder, int position) {
ForecastModel model = mHourlyData.get(position);
holder.mTemperature.setText(String.valueOf(model.getHourlyForecast().get(position).getDt()));
}
@Override
public int getItemCount() {
return mHourlyData.size();
}
public class HourlyViewHolder extends RecyclerView.ViewHolder {
private TextView mTemperature, mPressure, mHumidity, mWindSpeed, mDescription;
private ImageView mIcon;
public HourlyViewHolder(@NonNull View itemView) {
super(itemView);
mTemperature = itemView.findViewById(R.id.hourly_temperature);
mPressure = itemView.findViewById(R.id.hourly_pressure);
mHumidity = itemView.findViewById(R.id.hourly_humidity);
mWindSpeed = itemView.findViewById(R.id.hourly_wind_speed);
mDescription = itemView.findViewById(R.id.hourly_description);
}
}
}
适配器中的 setData
方法有点误导(命名和变量方面)。查看 Activity
中的 onChanged
方法:您正在使用的是单个 ForecastModel
对象。将该对象作为名为 mHourlyData
的 List
传递给 setData
中的适配器是导致最初混淆的原因。 List
的大小将始终为 1,从而导致您面临的问题。
我建议更改 onChanged
方法调用以简单地执行此操作:
adapter.setData(forecast)
并重命名 setData
中的适配器变量以反映您实际接收(想要接收)的内容:
private List<HourlyForecast> mHourlyForecast = new ArrayList<>();
public void setData(ForecastModel forecast){
this.mHourlyForecast = forecast.hourlyForecast;
notifyDataSetChanged();
}
在那之后,唯一剩下要做的就是相应地更新您的 getItemCount
和 onBindViewHolder
方法。
我试图在 RecyclerView 中显示来自 API 响应的温度值。事情是我的程序不断地只显示一个,第一个项目。我不确定问题出在哪里,我觉得有点迷茫。
我要显示的 api 响应的一部分
"hourly": [
{
"dt": 1607184000,
"temp": x,
"feels_like": x,
"pressure": x,
"humidity": x,
"dew_point": x,
"uvi": x,
"clouds": x,
"visibility": x,
"wind_speed": x,
"wind_deg": x,
"pop": x
},
and so on...
型号class
public class ForecastModel {
@SerializedName("hourly")
private List<HourlyForecast> hourlyForecast = null;
public List<HourlyForecast> getHourlyForecast() {
return hourlyForecast;
}
public class HourlyForecast{
@SerializedName("dt")
private int dt;
public int getDt() {
return dt;
}
}
}
Activity class
public class HourlyForecastActivity extends AppCompatActivity {
private static final String TAG = "HourlyForecastActivity";
private List<ForecastModel> mData = new ArrayList<>();
RecyclerView recyclerView;
HourlyForecastAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hourly_forecast);
recyclerView = findViewById(R.id.hourly_recycler_view);
adapter = new HourlyForecastAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
prepareConnection();
}
private void prepareConnection(){
ForecastViewModel viewModel = new ViewModelProvider(this).get(ForecastViewModel.class);
viewModel.getData().observe(this, new Observer<ForecastModel>() {
@Override
public void onChanged(ForecastModel forecast) {
if (mData.size() > 0){
mData.clear();
}
if (forecast != null){
mData.addAll(Collections.singleton(forecast));
adapter.setData(mData);
}
}
});
}
}
适配器class
public class HourlyForecastAdapter extends RecyclerView.Adapter<HourlyForecastAdapter.HourlyViewHolder> {
private List<ForecastModel> mHourlyData = new ArrayList<>();
public void setData(List<ForecastModel> mHourlyData){
this.mHourlyData = mHourlyData;
notifyDataSetChanged();
}
@NonNull
@Override
public HourlyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.hourly_items, parent, false);
return new HourlyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull HourlyViewHolder holder, int position) {
ForecastModel model = mHourlyData.get(position);
holder.mTemperature.setText(String.valueOf(model.getHourlyForecast().get(position).getDt()));
}
@Override
public int getItemCount() {
return mHourlyData.size();
}
public class HourlyViewHolder extends RecyclerView.ViewHolder {
private TextView mTemperature, mPressure, mHumidity, mWindSpeed, mDescription;
private ImageView mIcon;
public HourlyViewHolder(@NonNull View itemView) {
super(itemView);
mTemperature = itemView.findViewById(R.id.hourly_temperature);
mPressure = itemView.findViewById(R.id.hourly_pressure);
mHumidity = itemView.findViewById(R.id.hourly_humidity);
mWindSpeed = itemView.findViewById(R.id.hourly_wind_speed);
mDescription = itemView.findViewById(R.id.hourly_description);
}
}
}
适配器中的 setData
方法有点误导(命名和变量方面)。查看 Activity
中的 onChanged
方法:您正在使用的是单个 ForecastModel
对象。将该对象作为名为 mHourlyData
的 List
传递给 setData
中的适配器是导致最初混淆的原因。 List
的大小将始终为 1,从而导致您面临的问题。
我建议更改 onChanged
方法调用以简单地执行此操作:
adapter.setData(forecast)
并重命名 setData
中的适配器变量以反映您实际接收(想要接收)的内容:
private List<HourlyForecast> mHourlyForecast = new ArrayList<>();
public void setData(ForecastModel forecast){
this.mHourlyForecast = forecast.hourlyForecast;
notifyDataSetChanged();
}
在那之后,唯一剩下要做的就是相应地更新您的 getItemCount
和 onBindViewHolder
方法。