2017-06-01 62 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