我已调用Darksky api进行翻新天气预报,并在三种不同的卡片视图下使用它显示了未来三天的天气状况。但是我已经在xml文件中垂直对齐了它:
public class dashboard extends Fragment {
//declarations
private static final String BASE_URL = "https://api.darksky.net/forecast/xxx/";
public dashboard(){
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GPSTracker gpsTracker = new GPSTracker(getActivity());
addressLine = gpsTracker.getLocality(getActivity());
getCurrentData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
view = inflater.inflate(R.layout.fragment_dashboard, container, false);
Temp_today = view.findViewById(R.id.Temp_today);
description_today = view.findViewById(R.id.description_today);
pressure_today = view.findViewById(R.id.pressure_today);
humidity_today = view.findViewById(R.id.humidity_today);
rainp_today = view.findViewById(R.id.rainp_today);
loc1 = view.findViewById(R.id.loc1);
loc2 = view.findViewById(R.id.loc2);
loc3 = view.findViewById(R.id.loc3);
dnt = view.findViewById(R.id.dnt);
Min_Max = view.findViewById(R.id.Min_Max);
description_tom = view.findViewById(R.id.description_tom);
pressure_tom = view.findViewById(R.id.pressure_tom);
humidity_tom = view.findViewById(R.id.humidity_tom);
rainp_tom = view.findViewById(R.id.rainp_tom);
tommorowdate = view.findViewById(R.id.tommorowdate);
Min_Max_tom = view.findViewById(R.id.Min_Maxtom);
description_da = view.findViewById(R.id.description_da);
pressure_da = view.findViewById(R.id.pressure_da);
humidity_da = view.findViewById(R.id.humidity_da);
rainp_da = view.findViewById(R.id.rainp_da);
da_date = view.findViewById(R.id.dadate);
Min_Max_da = view.findViewById(R.id.Min_Maxda);
lAV1 = view.findViewById(R.id.lAV1);
lAV2 = view.findViewById(R.id.lAV2);
lAV3 = view.findViewById(R.id.lAV3);
return view;
}
public void getCurrentData() {
GPSTracker gps = new GPSTracker(getActivity());
if(gps.canGetLocation()){
latitude = gps.getLatitude();
longitude = gps.getLongitude();
}else{
gps.showSettingsAlert();
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
WeatherService service = retrofit.create(WeatherService.class);
Call<Forecast> call = service.getWeather(latitude, longitude);
call.enqueue(new Callback<Forecast>() {
@Override
public void onResponse(Call<Forecast> call, @NonNull Response<Forecast> response) {
if (response.code() == 200) {
Forecast forecast = response.body();
assert forecast != null;
Calendar calendar = Calendar.getInstance();
TimeZone tz = TimeZone.getDefault();
calendar.add(Calendar.MILLISECOND, tz.getOffset(calendar.getTimeInMillis()));
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-YYYY HH:mm:ss", Locale.getDefault());
SimpleDateFormat sdf1 = new SimpleDateFormat("dd-MM-YYYY", Locale.getDefault());
double temptoday = forecast.getCurrently().getTemperature();
double pr = forecast.getCurrently().getPressure();
double hum = forecast.getCurrently().getHumidity();
double prec_prob = forecast.getCurrently().getPrecipProbability();
int t = forecast.getCurrently().getTime();
double maxtemp_today = forecast.getDaily().getData().get(0).getTemperatureMax();
double mintemp_today = forecast.getDaily().getData().get(0).getTemperatureMax();
icon_today = forecast.getCurrently().getIcon();
java.util.Date currenTimeZone1 =new java.util.Date((long)t*1000);
String time1= sdf.format(currenTimeZone1);
double t1 = (5.0/9.0)*(temptoday-32);
double mx_t1 = (5.0/9.0)*(maxtemp_today-32);
double mn_t1 = (5.0/9.0)*(mintemp_today-32);
desc_today = forecast.getCurrently().getSummary();
temp_today=(String.format("%.2f",t1)+(char) 0x00B0+"C");
press_today = ("Pressure: " +String.valueOf(pr)+" hPa");
humid_today = ("Humidity: " +String.valueOf(hum)+" %");
rainpro_today = ("Rain Probability: " +String.valueOf(prec_prob)+" %");
max_min_today = String.format("%.2f",mn_t1)+(char) 0x00B0+"C"+"-" + String.format("%.2f",mx_t1)+(char) 0x00B0+"C";
Temp_today.setText(temp_today);
description_today.setText(desc_today);
pressure_today.setText(press_today);
humidity_today.setText(humid_today);
rainp_today.setText(rainpro_today);
loc1.setText(addressLine);
loc2.setText(addressLine);
loc3.setText(addressLine);
dnt.setText(time1);
Min_Max.setText(max_min_today);
switch (icon_today)
{
case "clear-day": lAV1.setAnimation(R.raw.clearday);
break;
case "clear-night": lAV1.setImageResource(R.drawable.night);
break;
case "rain": lAV1.setAnimation(R.raw.rain);
break;
case "snow": lAV1.setAnimation(R.raw.snowy);
break;
case "fog": lAV1.setAnimation(R.raw.fog);
break;
case "cloudy": lAV1.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-day": lAV1.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-night": lAV1.setAnimation(R.raw.cloudynight);
break;
default:lAV1.setAnimation(R.raw.dfault);
break;
}
desc_tom = String.valueOf(forecast.getDaily().getData().get(1).getSummary());
press_tom = String.valueOf(forecast.getDaily().getData().get(1).getPressure());
humid_tom = String.valueOf(forecast.getDaily().getData().get(1).getHumidity());
rainpro_tom = String.valueOf(forecast.getDaily().getData().get(1).getPrecipProbability());
double tommorow_date = forecast.getDaily().getData().get(1).getTime();
double mx_tom = forecast.getDaily().getData().get(1).getTemperatureMax();
double mn_tom = forecast.getDaily().getData().get(1).getTemperatureMin();
icon_tom = forecast.getDaily().getData().get(1).getIcon();
java.util.Date currenTimeZone2 =new java.util.Date((long)tommorow_date*1000);
String time2= sdf1.format(currenTimeZone2);
double mx_tomm = (5.0/9.0)*(mx_tom-32);
double mn_tomm = (5.0/9.0)*(mn_tom-32);
description_tom.setText(desc_tom);
pressure_tom.setText("Pressure: " +press_tom+" hPa");
humidity_tom.setText("Humidity: " +humid_tom+" %");
rainp_tom.setText("Rain Probability: " +rainpro_tom+" %");
tommorowdate.setText(time2);
Min_Max_tomtxt= (String.format("%.2f",mn_tomm) + (char)0x00B0+"C"+"-"+String.format("%.2f",mx_tomm)+(char)0x00B0+"C");
Min_Max_tom.setText(Min_Max_tomtxt);
switch (icon_tom)
{
case "clear-day": lAV2.setAnimation(R.raw.clearday);
break;
case "clear-night": lAV2.setImageResource(R.drawable.night);
break;
case "rain": lAV2.setAnimation(R.raw.rain);
break;
case "fog": lAV2.setAnimation(R.raw.fog);
break;
case "cloudy": lAV2.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-day": lAV2.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-night": lAV2.setAnimation(R.raw.cloudynight);
break;
default:lAV2.setAnimation(R.raw.dfault);
break;
}
desc_da = String.valueOf(forecast.getDaily().getData().get(2).getSummary());
press_da = String.valueOf(forecast.getDaily().getData().get(2).getPressure());
humid_da = String.valueOf(forecast.getDaily().getData().get(2).getHumidity());
rainpro_da = String.valueOf(forecast.getDaily().getData().get(2).getPrecipProbability());
double date_da = forecast.getDaily().getData().get(2).getTime();
double max_da = forecast.getDaily().getData().get(2).getTemperatureMax();
double min_da = forecast.getDaily().getData().get(2).getTemperatureMin();
icon_da = forecast.getDaily().getData().get(2).getIcon();
java.util.Date currenTimeZone3 =new java.util.Date((long)date_da*1000);
String time3 = sdf1.format(currenTimeZone3);
double mx_t2 = (5.0/9.0)*(max_da-32);
double mn_t2 = (5.0/9.0)*(min_da-32);
description_da.setText(desc_da);
pressure_da.setText("Pressure: " +press_da+" hPa");
humidity_da.setText("Humidity: " +humid_da+" %");
rainp_da.setText("Rain Probability: " +rainpro_da+" %");
da_date.setText(time3);
Min_Max_datxt = String.format("%.2f",mn_t2)+(char)0x00B0+"C"+"-"+String.format("%.2f",mx_t2)+(char)0x00B0+"C";
Min_Max_da.setText(Min_Max_datxt);
switch (icon_da)
{
case "clear-day": lAV3.setAnimation(R.raw.clearday);
break;
case "clear-night": lAV3.setImageResource(R.drawable.night);
break;
case "rain": lAV3.setAnimation(R.raw.rain);
break;
case "fog": lAV3.setAnimation(R.raw.fog);
break;
case "cloudy": lAV3.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-day": lAV3.setAnimation(R.raw.cloudy);
break;
case "partly-cloudy-night": lAV3.setAnimation(R.raw.cloudynight);
break;
default:lAV3.setAnimation(R.raw.dfault);
break;
}
}
}
@Override
public void onFailure(Call<Forecast> call, Throwable t) {
}
});
}
}
但是现在,我想将这三张卡片放在水平的回收站视图或viewpager中。但是我没有得到如何为其创建适配器类的信息,因为这三个卡视图并不完全相同,因此它们是多个视图。绑定视图的getitemview类应提供什么条件?
我也在这里插入xml文件。但是我不能,因为它超出了字数限制。
当您制作recyclerview或viewpager时,必须制作适配器。因此在适配器中,您可以创建多个视图类型。
例如,
public class MyCardAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private ArrayList<MyCard> mList;
private ItemClick itemClick;
public interface ItemClick {
public void onDelete(View view, int position);
public void onAddCard(View view, int position);
}
public void setItemClick(ItemClick itemClick) {
this.itemClick = itemClick;
}
public class MyCardViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout cardItem;
private ImageView imgCompanyLogo;
private TextView tvCompanyLogo;
private TextView tvDeleteMyCard;
private TextView tvCardNo;
public MyCardViewHolder(@NonNull View itemView) {
super(itemView);
this.cardItem = (RelativeLayout) itemView.findViewById(R.id.card_item);
this.imgCompanyLogo = (ImageView) itemView.findViewById(R.id.img_company_logo);
this.tvCompanyLogo = (TextView) itemView.findViewById(R.id.tv_company_logo);
this.tvDeleteMyCard = (TextView) itemView.findViewById(R.id.tv_delete_my_card);
this.tvCardNo = (TextView) itemView.findViewById(R.id.tv_card_no);
}
}
public class AddMyCardViewHolder extends RecyclerView.ViewHolder {
private RelativeLayout cardItem;
public AddMyCardViewHolder(@NonNull View itemView) {
super(itemView);
this.cardItem = (RelativeLayout) itemView.findViewById(R.id.card_item);
}
}
public MyCardAdapter(Context context, ArrayList<MyCard> mList) {
this.context = context;
this.mList = mList;
}
@Override
public int getItemViewType(int position) {
switch (mList.get(position).viewType) {
case 0:
return MyCard.CARD_TYPE;
case 1:
return MyCard.ADD_CARD_TYPE;
default:
return -1;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
View view;
switch (viewType) {
case MyCard.CARD_TYPE:
view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.my_card_list_item, viewGroup, false);
return new MyCardViewHolder(view);
case MyCard.ADD_CARD_TYPE:
view = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.add_card_item, viewGroup, false);
return new AddMyCardViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
MyCard myCard = mList.get(position);
if (myCard != null) {
switch (myCard.viewType) {
case MyCard.CARD_TYPE:
if (myCard.getLogoUrl().equals("")) {
((MyCardViewHolder) holder).imgCompanyLogo.setVisibility(View.GONE);
((MyCardViewHolder) holder).tvCompanyLogo.setVisibility(View.VISIBLE);
((MyCardViewHolder) holder).tvCompanyLogo.setText(myCard.getCardName());
} else {
((MyCardViewHolder) holder).imgCompanyLogo.setVisibility(View.VISIBLE);
((MyCardViewHolder) holder).tvCompanyLogo.setVisibility(View.GONE);
// Glide.with(context).load(mList.get(position).getLogoUrl() + "?t=s").into(myCardViewHolder.imgCompanyLogo);
Glide.with(context).load(myCard.getLogoUrl()).into(((MyCardViewHolder) holder).imgCompanyLogo);
}
((MyCardViewHolder) holder).tvCardNo.setText(myCard.getCardNo());
((MyCardViewHolder) holder).tvDeleteMyCard.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
if (itemClick != null) {
itemClick.onDelete(v, position);
}
}
});
String backColorHex = mList.get(position).getColor();
int backColor = Color.parseColor(backColorHex);
int contrastColor = getContrastColor(backColor);
GradientDrawable shape = new GradientDrawable();
shape.setShape(GradientDrawable.RECTANGLE);
shape.setCornerRadius(DataUtil.convertDpToPixel(12, context));
shape.setColor(backColor);
shape.setStroke(DataUtil.convertDpToPixel(1, context), ContextCompat.getColor(context, R.color.transparency_19));
((MyCardViewHolder) holder).cardItem.setBackground(shape);
((MyCardViewHolder) holder).tvCardNo.setTextColor(contrastColor);
((MyCardViewHolder) holder).tvCompanyLogo.setTextColor(contrastColor);
break;
case MyCard.ADD_CARD_TYPE:
((AddMyCardViewHolder) holder).cardItem.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
if (itemClick != null) {
itemClick.onAddCard(v, position);
}
}
});
break;
}
}
}
public static int getContrastColor(int colorIntValue) {
int red = Color.red(colorIntValue);
int green = Color.green(colorIntValue);
int blue = Color.blue(colorIntValue);
double lum = (((0.299 * red) + ((0.587 * green) + (0.114 * blue))));
return lum > 186 ? 0xFF000000 : 0xFFFFFFFF;
}
@Override
public int getItemCount() {
return (null != mList ? mList.size() : 0);
}
}
这是我使用的适配器。您可以在适配器中进行设置。