水平多视图回收器视图

问题描述 投票:0回答:1

我已调用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文件。但是我不能,因为它超出了字数限制。

android recycler-adapter horizontal-recyclerview
1个回答
0
投票

当您制作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);
    }
}

这是我使用的适配器。您可以在适配器中进行设置。

© www.soinside.com 2019 - 2024. All rights reserved.