2017-06-01 70 views
0

我需要使用Retrofit2将JSON数据解析为Horizo​​ntalScrollView。我将它解析成ListView成功,但我没有想象如何将它做到Horizo​​ntalScrollView。谷歌不能给我正确的答案。使用Retrofit将JSON数据解析为Horizo​​ntalScrollView 2

我的代码与下面的ListView。

P.S.我想要做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); 
} 

}

马伊纳ctivity.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) { 

     } 
    }); 
} 
+0

ca ñ你请详细说明你的问题,我不明白你想用horizo​​ntalscrollView和列表做什么? –

+0

为什么ListView不够用?对象的“列表”适合于这个确切的目的。这不是一个真正的编程问题,因为你的代码工作。 –

+0

我想要做Horizo​​ntalScrollView而不是ListView。 – EAMax

回答

0

可以使用回收查看与LinearLayoutManager使用horizo​​natal滚动型与构造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) { 

     } 
    }); 
} 

,改变ListViewRecycleView在XML和代码中也.....

+0

对不起,但我在“myList.setAdapter(adapter)”中有错误。 “RecyclerView中的setAdapter无法应用”。我完全和你一样悲伤。帮助请参阅 – EAMax

+0

您必须创建CustomAdapter扩展'RecyclerView.Adapter '看看这个例子: - http://www.androidhive.info/2016/01/android-working-with-recycler-view/ – sushildlh

+0

是的。有用。非常感谢你! – EAMax