Android RecyclerView复杂布局 实现多Item,item中含视频文件播放

效果(随手画的啊,哈哈哈)

 

主要就是Adapter里面的内容

import android.content.Context;
import android.content.SharedPreferences;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.alibaba.android.arouter.launcher.ARouter;
import com.baidu.cloud.media.player.IMediaPlayer;
import com.baidu.cloud.videoplayer.widget.BDCloudVideoView;
import com.dreamlive.upmarqueeview.UPMarqueeView;
import com.example.zl.myapplication.R;
import com.example.zl.utils.GlideImageLoader;
import com.youth.banner.Banner;
import com.youth.banner.BannerConfig;
import com.youth.banner.Transformer;

import java.util.ArrayList;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import de.hdodenhof.circleimageview.CircleImageView;

/**
 * Created by Zl on 2018/7/23.
 */

public class HomeAdapter extends RecyclerView.Adapter
//        implements IMediaPlayer.OnCompletionListener
{
    private LayoutInflater inflater;
    private List<Integer> imgList;
    private List<String> marqueeList;
    private List<Integer> columnImgList;
    private List<String> columnTextList;
    private List<Integer> NumTwoImgList;
    private List<String> NumTwoTextList;
    private List<Integer> NumThreeImgList;
    private List<String> NumThreeTextList;
    private List<Integer> NormalImgList;
    private List<String> NormalTextList;

    private static final int BANNER = 0;
    private static final int COLUMN = 1;
    private static final int MARQUEE = 2;
    private static final int NUM_TWO = 3;
    private static final int TITLE = 4;
    private static final int NUM_THREE = 5;
    private static final int NORMAL = 6;
    private static final int PERCENT = 7;

    private Context mContext;
    private BDCloudVideoView mVV;
    String url1 = "http://hi2mjn97mjn2tc40unn.exp"
            + ".bcevod.com/mda-hkzib2fjdgq24cvu/mp41080p/mda-hkzib2fjdgq24cvu.mp4";

    public HomeAdapter(Context mContext,BDCloudVideoView mVV) {
        this.mContext= mContext;
        this.mVV=mVV;
        inflater = LayoutInflater.from(mContext);
        //添加轮播数据
        addBannerData();
        //
        addColumnData();
        //添加跑马灯数据
        addMarqueeData();
        //
        addNumTwoData();
        //
        addNumThreeData();
        //
        addNormalData();
    }

    //数据源Size

    @Override
    public int getItemCount() {
        return 26;
    }

    //实现多item布局,用不同的itemType去加载不同的布局。    

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return BANNER;
        } else if (position >= 1 && position <= 8) {
            return COLUMN;
        } else if (position == 9) {
            return MARQUEE;
        } else if (position >= 10 && position <= 13) {
            return NUM_TWO;
        } else if (position ==14) {
            return PERCENT;
        } else if (position == 15 || position == 19) {
            return TITLE;
        } else if (position >= 16 && position <= 18) {
            return NUM_THREE;
        } else if (position >= 20 && position <= 25) {
            return NORMAL;
        }
        return super.getItemViewType(position);
    }

    //引入item布局,得到View对象
    //创建ViewHolder对象,传入View,最return当前ViewHolder的对象

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        switch (viewType) {
            case BANNER:
                View itemBanner = inflater.inflate(R.layout.item_banner, parent, false);
                return new BannerHolder(itemBanner);
            case COLUMN:
                View itemColumn = inflater.inflate(R.layout.item_column, parent, false);
                return new ColumnHolder(itemColumn);
            case MARQUEE:
                View itemMarquee = inflater.inflate(R.layout.item_marquee, parent, false);
                return new MarqueeHolder(itemMarquee);
            case NUM_TWO:
                View itemNumTwo = inflater.inflate(R.layout.item_num_two, parent, false);
                return new NumTwoHolder(itemNumTwo);
            case PERCENT:
                View itemPercent = inflater.inflate(R.layout.item_percent, parent, false);
                return new PercentHolder(itemPercent);
            case TITLE:
                View itemTitle = inflater.inflate(R.layout.item_title, parent, false);
                return new TitleHolder(itemTitle);
            case NUM_THREE:
                View itemNumThree = inflater.inflate(R.layout.item_num_three, parent, false);
                return new NumThreeHolder(itemNumThree);
            case NORMAL:
                View itemNormal = inflater.inflate(R.layout.item_normal, parent, false);
                return new NormalHolder(itemNormal);
            default:
                return null;
        }
    }

    /**
     * 绑定数据
     *通过position获取当前item数据给holder对象内的对象添加set数据
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof BannerHolder) {
            setBanner((BannerHolder) holder);
        } else if (holder instanceof ColumnHolder) {
            setColumn((ColumnHolder) holder);
        } else if (holder instanceof MarqueeHolder && marqueeList != null) {
            setMarquee((MarqueeHolder) holder);
        } else if (holder instanceof NumTwoHolder) {
            setNumTwo((NumTwoHolder) holder);
        } else if (holder instanceof PercentHolder) {
            setPercent((PercentHolder) holder);
        } else if (holder instanceof TitleHolder) {
            setTitle((TitleHolder) holder, position);
        } else if (holder instanceof NumThreeHolder) {
            setNumThree((NumThreeHolder) holder);
        } else if (holder instanceof NormalHolder) {
            setNormal((NormalHolder) holder);
        }
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
        if (manager instanceof GridLayoutManager) {
            final GridLayoutManager gridManager = ((GridLayoutManager) manager);
            gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    int type = getItemViewType(position);
                    switch (type) {
                        case BANNER:
                            return 12;
                        case COLUMN:
                            return 3;
                        case MARQUEE:
                            return 12;
                        case NUM_TWO:
                            return 6;
                        case PERCENT:
                            return 12;
                        case TITLE:
                            return 12;
                        case NUM_THREE:
                            return 4;
                        case NORMAL:
                            return 6;

                        default:
                            return 12;
                    }
                }
            });
        }
    }


    /**
     * 轮播图
     */
    public class BannerHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.banner)
        Banner banner;

        BannerHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class ColumnHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.circleImage)
        CircleImageView circleImage;
        @BindView(R.id.tv_img_name)
        TextView tv_img_name;

        public ColumnHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    /**
     * 跑马灯
     */
    public class MarqueeHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.marquee)
        UPMarqueeView marquee;

        public MarqueeHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class NumTwoHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.textView)
        TextView textView;
        @BindView(R.id.textView2)
        TextView textView2;
        @BindView(R.id.image_one)
        ImageView image_one;
        @BindView(R.id.imageView3)
        ImageView imageView3;

        public NumTwoHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class TitleHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.tv_title)
        TextView tvTitle;

        public TitleHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class NumThreeHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.iv_three_img)
        ImageView iv_three_img;
        @BindView(R.id.tv_three_name)
        TextView tv_three_name;

        public NumThreeHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }


    public class NormalHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.iv_liked)
        ImageView iv_liked;
        @BindView(R.id.tv_good_name)
        TextView tv_good_name;
        @BindView(R.id.tv_good_price)
        TextView tv_good_price;

        public NormalHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }

    public class PercentHolder extends RecyclerView.ViewHolder {
//        @BindView(R.id.tv_color_one)
//        TextView tv_color_one;
        @BindView(R.id.view_holder)
        RelativeLayout view_holder;
        @BindView(R.id.tv_color_two)
        TextView tv_color_two;
        @BindView(R.id.tv_color_three)
        TextView tv_color_three;
        @BindView(R.id.tv_color_four)
        TextView tv_color_four;
        @BindView(R.id.tv_color_five)
        TextView tv_color_five;
        public PercentHolder(View itemPercent) {
            super(itemPercent);
            ButterKnife.bind(this, itemView);
        }
    }

    /**
     * 轮播图图片列表
     */
    private void addBannerData() {
        imgList = new ArrayList<>();
        imgList.add(R.drawable.home_pic);
        imgList.add(R.drawable.home_pic);
        imgList.add(R.drawable.home_pic);
    }

    /**
     * 添加跑马灯数据
     */
    private void addMarqueeData() {
        marqueeList = new ArrayList<>();
        marqueeList.add("寒蝉凄切,对长亭晚,骤雨初歇。");
        marqueeList.add("都门帐饮无绪,留恋处,兰舟催发。");
        marqueeList.add("执手相看泪眼,竟无语凝噎。");
        marqueeList.add("念去去,千里烟波,暮霭沉沉楚天阔。");
    }

    private void addColumnData() {
        columnImgList = new ArrayList<>();
        for (int i = 0; i < 8; i++) {
            columnImgList.add(R.drawable.girl);
        }
        columnTextList = new ArrayList<>();
        for (int i = 0; i < 8; i++) {
            columnTextList.add("美女");
        }
    }

    private void addNumTwoData() {
        NumTwoImgList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
        }
//            NumTwoImgList.add(R.drawable.cloth);

        NumTwoTextList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
        }
//            NumTwoTextList.add("买衣服");
    }

    private void addNumThreeData() {
        NumThreeImgList = new ArrayList<>();

        NumThreeTextList = new ArrayList<>();
    }


    private void addNormalData() {
        NormalImgList = new ArrayList<>();

        NormalTextList = new ArrayList<>();
    }


    /**
     * 绑定轮播图数据
     */
    private void setBanner(BannerHolder holder) {
        holder.banner.setBannerStyle(BannerConfig.NUM_INDICATOR);
        holder.banner.setImageLoader(new GlideImageLoader());
        holder.banner.setImages(imgList);
        holder.banner.setBannerAnimation(Transformer.Default);
        holder.banner.isAutoPlay(true);
        holder.banner.setDelayTime(3000);
        holder.banner.setIndicatorGravity(BannerConfig.CENTER);
        holder.banner.start();
    }

    /**
     * 设置跑马灯
     */
    private void setMarquee(MarqueeHolder holder) {
        List<View> views = new ArrayList<>();
        for (int i = 0; i < marqueeList.size(); i = i + 2) {
            LinearLayout view = (LinearLayout) inflater.inflate(R.layout.marquee_text, null);
            TextView textTop = (TextView) view.findViewById(R.id.text_top);
            TextView textBottom = (TextView) view.findViewById(R.id.text_bottom);
            textTop.setText(marqueeList.get(i));
            if (marqueeList.size() > i + 1) {
                textBottom.setText(marqueeList.get(i + 1));
            }
            views.add(view);
        }
        holder.marquee.setViews(views);
    }

    public void setColumn(ColumnHolder holder) {
        holder.tv_img_name.setText("美女");
        holder.circleImage.setImageResource(R.drawable.girl);
    }

    public void setNumTwo(NumTwoHolder holder) {
        holder.image_one.setImageResource(R.drawable.dress);
        holder.imageView3.setImageResource(R.drawable.cloth);
        holder.textView.setText("晚与你");
        holder.textView2.setText("see you");
    }

    public void setNumThree(NumThreeHolder holder) {
        holder.iv_three_img.setImageResource(R.drawable.boy);
        holder.tv_three_name.setText("森林木");
    }

    public void setNormal(NormalHolder holder) {
        holder.iv_liked.setImageResource(R.drawable.boy);
        holder.tv_good_name.setText("森林木");
        holder.tv_good_price.setText("¥200");
    }

    public void setPercent(PercentHolder holder) {
        playVideo((PercentHolder) holder);
//        holder.tv_color_one.setText("1");
//
//        holder.tv_color_one.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                ARouter.getInstance().build("/test/videoPlay").navigation();
//            }
//        });
        holder.tv_color_two.setText("2");
        holder.tv_color_three.setText("3");
        holder.tv_color_four.setText("4");
        holder.tv_color_five.setText("5");
    }

    private void playVideo(PercentHolder holder) {
        BDCloudVideoView.setAK("");

        mVV = new BDCloudVideoView(mContext);
        mVV.setLooping(true);//是否循环播放
        mVV.setBufferTimeInMs(0);//设置"加载中"触发时,缓存多长时间的数据才结束
        mVV.setVideoPath(url1);

        /**
         * 铺满,不保证视频内容宽高比。视频显示与屏幕宽高相等
         */
        mVV.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_MATCH_PARENT);
//        if (isPlayerFitModeCrapping(mContext)) {
//            mVV.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING);
//        } else {
//            mVV.setVideoScalingMode(BDCloudVideoView.VIDEO_SCALING_MODE_SCALE_TO_FIT);
//        }
        RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(-1, -1);
        rllp.addRule(RelativeLayout.CENTER_IN_PARENT);
        holder.view_holder.addView(mVV, rllp);

        mVV.start();
    }

    /**
     * 模块标题
     */
    private void setTitle(TitleHolder holder, int position) {
        switch (position) {
            case 15:
                holder.tvTitle.setText("精品推荐");
                break;
            case 19:
                holder.tvTitle.setText("猜你喜欢");
                break;
        }
    }


//    @Override
//    public void onCompletion(IMediaPlayer iMediaPlayer) {
//        if (mVV!=null){
            mVV.
//        }
//    }


    private static final String SETTINGS_SPNAME = "video-settings";
    public static boolean isPlayerFitModeCrapping(Context context) {
        SharedPreferences spList = context.getSharedPreferences(SETTINGS_SPNAME, 0);
        return spList.getBoolean("isCrapping", false);
    }

 

Activity内容

public class MainActivity extends AppCompatActivity {
 private static final String TAG="MainActivity";
    private Button button;
    private Button button_binding;

    private Unbinder mUnBinder;
    @BindView(R.id.rc_Home)
    RecyclerView rcHome;
    BDCloudVideoView mVV= null;
    boolean isPausedByOnPause = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
//        ARouter.getInstance().inject(this);
        mUnBinder = ButterKnife.bind(this);
        initView();

    }

    private void initView() {

        mVV = new BDCloudVideoView(this);
        HomeAdapter adapter = new HomeAdapter(this, mVV);
        GridLayoutManager layoutManger = new GridLayoutManager(this, 12);
        rcHome.setLayoutManager(layoutManger);
        rcHome.setAdapter(adapter);
    }


    @Override
    protected void onPause() {
        super.onPause();
        Log.v(TAG, "onPause");
        // 当home键切出,想暂停视频的话,反注释下面的代码。同时要反注释onResume中的代码
        if (mVV.isPlaying()) {
            isPausedByOnPause = true;
            mVV.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
//         当home键切出,暂停了视频此时想回复的话,反注释下面的代码
        if (isPausedByOnPause) {
            isPausedByOnPause = false;
            mVV.start();
        }
        Log.v(TAG, "onResume");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.v(TAG, "onRestart");
        if (mVV!=null){
            mVV.enterBackground();
        }
    }

    @Override
    protected void onStop() {
        Log.v(TAG, "onStop");
        // enterBackground should be invoke before super.onStop()
        if (mVV != null) {
            mVV.enterBackground();
        }
        super.onStop();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mUnBinder.unbind();
        if (mVV != null) {
            mVV.stopPlayback(); // 释放播放器资源
            mVV.release(); // 释放播放器资源和显示资源
        }
        mVV = null;
//        if (mediaController != null) {
//            mediaController.release();
//        }
        Log.v(TAG, "onDestroy");
    }
}

 

后期更新剩余代码以及Demo,如果有优化会加上的。我也是这周才写的,每天写点点,今天才把视频加进来。。

更新:

1.解决列表中视频文件生命周期问题

待解决:

1.多格式视频文件缓存

 

资源:

百度音视频:https://cloud.baidu.com/doc/MCT/Android-Player-SDK-2.0.html#.47.AE.13.BF.62.BE.FC.FA.FE.83.60.80.53.2F.B9.AD 

(有兴趣了解音视频的可以去看下demo和sdk,里面还有很多方法。)

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值