java - 使用 Retrofit 2 将 JSON 数据解析为 Horizo​​ntalScrollView

标签 java android json retrofit2 horizontalscrollview

我需要使用 Retrofit2 将 JSON 数据解析到 Horizo​​ntalScrollView 中。我成功地将其解析为ListView,但我不知道如何将其解析为Horizo​​ntalScrollView。 Google 无法给我正确的答案。

下面是我的 ListView 代码。

附注我想做 Horizo​​ntalScrollView 而不是 ListView。

Like this.

MyForecastAdapter.java

public class MyForecastAdapter extends ArrayAdapter<Forecast> {

List<Forecast> forecastList;
Context context;
private LayoutInflater inflater;

public MyForecastAdapter(Context context, List<Forecast> objects) {
    super(context, 0, objects);
    this.context = context;
    this.inflater = LayoutInflater.from(context);
    forecastList = objects;
}

@Override
public Forecast getItem(int position) {
    return forecastList.get(position);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if (convertView == null) {
        View view = inflater.inflate(R.layout.activity_row, parent, false);
        viewHolder = ViewHolder.create((RelativeLayout) view);
        view.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    Forecast item = getItem(position);

    viewHolder.textViewTemp.setText(item.getMain().getTemp());
    viewHolder.textViewHumidity.setText(item.getMain().getHumidity());

    return viewHolder.relativeLayout;
}

private static class ViewHolder {
    public final RelativeLayout relativeLayout;
    public final TextView textViewTemp;
    public final TextView textViewHumidity;

    private ViewHolder(RelativeLayout relativeLayout, TextView textViewTemp, TextView textViewHumidity) {
        this.relativeLayout = relativeLayout;
        this.textViewTemp = textViewTemp;
        this.textViewHumidity = textViewHumidity;
    }

    public static ViewHolder create(RelativeLayout relativeLayout) {
        TextView textViewTemp = (TextView) relativeLayout.findViewById(R.id.textViewTemp);
        TextView textViewHumidity = (TextView) relativeLayout.findViewById(R.id.textViewHumidity);
        return new ViewHolder(relativeLayout, textViewTemp, textViewHumidity);
    }
}

}

ForecastList.java

public class ForecastList {

@SerializedName("list")
@Expose
private ArrayList<Forecast> forecasts = new ArrayList<>();

public ArrayList<Forecast> getForecasts() {
    return forecasts;
}

public void setForecasts(ArrayList<Forecast> forecasts) {
    this.forecasts = forecasts;
}

}

Forecast.java - getters/setters。

ApiService.java

public interface ApiService {

@GET("/data/2.5/forecast?q=Kirov,ru&appid=/../")
Call<ForecastList> getMyJSON();

}

RetrofitClient.java

public class RetrofitClient {

private static final String ROOT_URL = "http://api.openweathermap.org";

private static Retrofit getRetrofitInstance() {
    return new Retrofit.Builder().baseUrl(ROOT_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build();
}

public static ApiService getApiService() {
    return getRetrofitInstance().create(ApiService.class);
}

}

MainActivity.java

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    forecastList = new ArrayList<>();
    parentView = findViewById(R.id.parentLayout);

    listView = (ListView) findViewById(R.id.listView);

    ApiService apiService = RetrofitClient.getApiService();

    Call<ForecastList> call = apiService.getMyJSON();

    call.enqueue(new Callback<ForecastList>() {
        @Override
        public void onResponse(Call<ForecastList> call, Response<ForecastList> response) {
            if (response.isSuccessful()) {
                forecastList = response.body().getForecasts();

                adapter = new MyForecastAdapter(MainActivity.this, forecastList);
                listView.setAdapter(adapter);
            } else {
                Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onFailure(Call<ForecastList> call, Throwable t) {

        }
    });
}

最佳答案

您可以使用带有构造函数的 LinearLayoutManager 的回收 View 来使用水平 ScrollView new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

使用此代码......

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    forecastList = new ArrayList<>();
    parentView = findViewById(R.id.parentLayout);


    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);

    myList = (RecyclerView) findViewById(R.id.listView);
    myList.setLayoutManager(layoutManager);

    ApiService apiService = RetrofitClient.getApiService();

    Call<ForecastList> call = apiService.getMyJSON();

    call.enqueue(new Callback<ForecastList>() {
        @Override
        public void onResponse(Call<ForecastList> call, Response<ForecastList> response) {
            if (response.isSuccessful()) {
                forecastList = response.body().getForecasts();

                adapter = new MyForecastAdapter(MainActivity.this, forecastList);
                myList.setAdapter(adapter);
            } else {
                Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onFailure(Call<ForecastList> call, Throwable t) {

        }
    });
}

并在 XML 和代码中将 ListView 更改为 RecycleView......

关于java - 使用 Retrofit 2 将 JSON 数据解析为 Horizo​​ntalScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312730/

相关文章:

java - 用多个空格和字符拆分字符串

java - TCP Socket接收和处理多个消息

android - 从另一个 Activity 返回时,SearchView 获得焦点并打开键盘

c# - 将 .NET 外部 dll 合并到单个可执行文件

java - maven pom.xml敏感信息和VCS

android - 您需要使用 Facebook 设置登录才能访问 API

android - visual studio 2013 cordova 混合应用程序插件 : Location of apk file

javascript - Ember 数据 "Assertion Failed: Error: Assertion Failed: The response from a findAll must be an Array, not undefined"

mysql - 带有 bool 值的 mysql json_extract 中的奇怪行为

Java:获取 "hh:MM:ss a"格式的时间