HomeRecyclerAdapter.java 10.8 KB
package com.cnlive.goldenline.ui.adapter;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import com.cnlive.goldenline.R;
import com.cnlive.goldenline.model.Tabbean;
import com.cnlive.goldenline.model.home.MediaAssertBean;
import com.cnlive.goldenline.model.home.ZhiBoDetailBean;
import com.cnlive.goldenline.model.response.bean.LiveShowBean;
import com.cnlive.goldenline.ui.adapter.viewholder.DefaultBannerViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.DividerViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.EmptyViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.FindGoodShowViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.GuidanceViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.IntensityViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.OnAirViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.OnComingViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.OverstrikingDividerViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.PlayBackViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.SingleImageViewHolder;
import com.cnlive.goldenline.ui.adapter.viewholder.VideoTypeViewHolder;
import com.cnlive.goldenline.ui.base.BaseRecyclerAdapter;
import com.cnlive.goldenline.ui.model.DividerBean;
import com.cnlive.goldenline.ui.model.GuidanceBean;
import com.cnlive.goldenline.ui.model.PlayBackBean;
import com.cnlive.goldenline.ui.model.RecyclerViewNormalBean;
import com.cnlive.goldenline.util.LogUtils;

/**
 * Home页Adapter
 * 从上至下 依次 Banner-节目分类-直播推荐-重磅预约-回放-点播推荐
 * Created on 2017/2/24
 * Version V1.0
 */

public class HomeRecyclerAdapter extends BaseRecyclerAdapter<RecyclerViewNormalBean> {

    private View mHeaderView;

    private int spanCount = 2;

    private int maxItems;

    private static final String TAG = "HomeRecyclerAdapter";

    public HomeRecyclerAdapter(Context context) {
        super(context);
    }

    //最大公约数
    public int gcd(int p, int q) {
        if (q == 0) return p;
        return gcd(q, p % q);
    }

    //最小公倍数 
    public int lcm(int p, int q) {
        int pq = p * q;
        return pq / gcd(p, q);
    }

    public void setSpanCount(int maxItems) {
        if (maxItems <= 0) maxItems = 2;
        if (maxItems < 2) spanCount = 2;
        spanCount = lcm(2, maxItems);
        this.maxItems = maxItems;
        LogUtils.LOGE(TAG + " setSpanCount maxItems = " + maxItems + " spanCount = " + spanCount);
    }

    public void setHeaderView(View mHeaderView) {
        this.mHeaderView = mHeaderView;
        notifyDataSetChanged();
//        LogUtils.LOGE(TAG + " --- setHeaderView");
    }

    public int getRealPosition(@NonNull RecyclerView.ViewHolder holder) {
        int position = holder.getLayoutPosition();
        return mHeaderView == null ? position : position - 1;
    }

    @Override
    public int getItemCount() {
        int count = super.getItemCount();
        return (mHeaderView == null ? 0 : 1) + count;
    }

    @Override
    public int getItemViewType(int position) {
        if (mHeaderView != null && position == 0) {
            return ViewType.TYPE_BANNER;
        } else {
            RecyclerViewNormalBean item = getItem(mHeaderView != null ? position - 1 : position);
            int type = item.getDataType();
            LogUtils.LOGE(TAG + " getItemViewType --- position = " + position + " --- viewType = " + type);
            return type;
        }
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager layoutmanager = recyclerView.getLayoutManager();
        if (layoutmanager instanceof GridLayoutManager) {
            GridLayoutManager manager = (GridLayoutManager) layoutmanager;
            manager.setSpanCount(spanCount);
            LogUtils.LOGE(TAG + " onAttachedToRecyclerView  spanCount = " + spanCount + " maxItems = " + maxItems);
            manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    int viewType = getItemViewType(position);
                    switch (viewType) {
                        case ViewType.TYPE_VIDEOTYPE:
                            return spanCount / maxItems;
                        case ViewType.TYPE_PLAYBACK:
                        case ViewType.TYPE_MEDIASSERT:
                            return spanCount / 2;
                        case ViewType.TYPE_BANNER:
                        case ViewType.TYPE_ONAIR:
                        case ViewType.TYPE_INTENSITY:
                        case ViewType.TYPE_GUIDANCE:
                        case ViewType.TYPE_ONCOMING:
                        case ViewType.TYPE_DIVIDER:
                        case ViewType.TYPE_OVERSTRINKING_DIVIDER:
                        case ViewType.TYPE_ACTIVITY:
                        case ViewType.TYPE_NULL:
                        case ViewType.TYPE_DEFAULT_BANNER:
                            return spanCount;
                        default:
                            return spanCount;
                    }
                }
            });
        }
    }

    @Nullable
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case ViewType.TYPE_ACTIVITY:
                View img = inflater.inflate(R.layout.layout_single_img, parent, false);
                return new SingleImageViewHolder(img);
            case ViewType.TYPE_NULL:
                View imgNull = inflater.inflate(R.layout.layout_single_img, parent, false);
                return new SingleImageViewHolder(imgNull);
            case ViewType.TYPE_DIVIDER:
                View divider = inflater.inflate(R.layout.layout_divider, parent, false);
                return new DividerViewHolder(divider);
            case ViewType.TYPE_OVERSTRINKING_DIVIDER:
                View drvider = inflater.inflate(R.layout.layout_divider, parent, false);
                return new OverstrikingDividerViewHolder(drvider);
            case ViewType.TYPE_BANNER:
                return new EmptyViewHolder(mHeaderView);
            case ViewType.TYPE_GUIDANCE:
                View view = inflater.inflate(R.layout.layout_title_guidance, parent, false);
                return new GuidanceViewHolder(view);
            case ViewType.TYPE_VIDEOTYPE:
                View viewtype = inflater.inflate(R.layout.layout_tab_item, parent, false);
                return new VideoTypeViewHolder(viewtype);
            case ViewType.TYPE_ONAIR:
                View onair = inflater.inflate(R.layout.layout_liveshow_content, parent, false);
                return new OnAirViewHolder(onair);
            case ViewType.TYPE_INTENSITY:
                View intensity = inflater.inflate(R.layout.layout_intensity_order, parent, false);
                return new IntensityViewHolder(intensity);
            case ViewType.TYPE_PLAYBACK:
                View playback = inflater.inflate(R.layout.layout_playback_content, parent, false);
                return new PlayBackViewHolder(playback);
            case ViewType.TYPE_MEDIASSERT:
                view = inflater.inflate(R.layout.layout_findgoodshow, parent, false);
                return new FindGoodShowViewHolder(view);
            case ViewType.TYPE_ONCOMING:
                view = inflater.inflate(R.layout.layout_oncoming_content, parent, false);
                return new OnComingViewHolder(view);
            case ViewType.TYPE_DEFAULT_BANNER:
                view = inflater.inflate(R.layout.layout_default_banner, parent, false);
                return new DefaultBannerViewHolder(view);
        }

        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof EmptyViewHolder) {
//            LogUtils.LOGE(TAG + " onBindViewHolder --- Banner  return ");
            return;
        } else {
            RecyclerViewNormalBean normalBean = mItems.get(getRealPosition(holder));
//            LogUtils.LOGE(TAG + " onBindViewHolder -- normalBean = " + normalBean + " -- position = " + position + " holder = " + holder);
            try {
                if (holder instanceof VideoTypeViewHolder) {
                    VideoTypeViewHolder vtHolder = (VideoTypeViewHolder) holder;
                    vtHolder.show(mContext, (Tabbean) normalBean.getT());
                } else if (holder instanceof GuidanceViewHolder) {
                    GuidanceViewHolder guiHolder = (GuidanceViewHolder) holder;
                    guiHolder.show((GuidanceBean) normalBean.getT());
                } else if (holder instanceof OnAirViewHolder) {
                    OnAirViewHolder onairHolder = (OnAirViewHolder) holder;
                    onairHolder.show(mContext, (LiveShowBean) normalBean.getT());
                } else if (holder instanceof IntensityViewHolder) {
                    IntensityViewHolder intensityHolder = (IntensityViewHolder) holder;
                    intensityHolder.show(mContext, (LiveShowBean) normalBean.getT());
                } else if (holder instanceof PlayBackViewHolder) {
                    PlayBackViewHolder pbHolder = (PlayBackViewHolder) holder;
                    pbHolder.show(mContext, (PlayBackBean) normalBean.getT());
                } else if (holder instanceof OnComingViewHolder) {
                    OnComingViewHolder viewHolder = (OnComingViewHolder) holder;
                    viewHolder.show(mContext, (ZhiBoDetailBean) normalBean.getT(), position);
                } else if (holder instanceof FindGoodShowViewHolder) {
                    FindGoodShowViewHolder viewHolder = (FindGoodShowViewHolder) holder;
                    viewHolder.show(mContext, (MediaAssertBean) normalBean.getT(), position);
                } else if (holder instanceof DividerViewHolder) {
                    DividerViewHolder viewHolder = (DividerViewHolder) holder;
                    viewHolder.show(mContext, (DividerBean) normalBean.getT());
                } else if (holder instanceof SingleImageViewHolder) {
                    SingleImageViewHolder viewHolder = (SingleImageViewHolder) holder;
                    viewHolder.show(mContext, normalBean, position);
                } else if (holder instanceof DefaultBannerViewHolder) {
                    DefaultBannerViewHolder viewHolder = (DefaultBannerViewHolder) holder;
                    viewHolder.show(mContext, (Tabbean) normalBean.getT(), position);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


}