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@Overridepublic int getItemCount() {return 26;}//实现多item布局,用不同的itemType去加载不同的布局。 @Overridepublic 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的对象@Overridepublic 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*/@Overridepublic 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);}}@Overridepublic 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() {@Overridepublic 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;@Overrideprotected 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);}@Overrideprotected void onPause() {super.onPause();Log.v(TAG, "onPause");// 当home键切出,想暂停视频的话,反注释下面的代码。同时要反注释onResume中的代码if (mVV.isPlaying()) {isPausedByOnPause = true;mVV.pause();}}@Overrideprotected void onResume() {super.onResume();
// 当home键切出,暂停了视频此时想回复的话,反注释下面的代码if (isPausedByOnPause) {isPausedByOnPause = false;mVV.start();}Log.v(TAG, "onResume");}@Overrideprotected void onRestart() {super.onRestart();Log.v(TAG, "onRestart");if (mVV!=null){mVV.enterBackground();}}@Overrideprotected void onStop() {Log.v(TAG, "onStop");// enterBackground should be invoke before super.onStop()if (mVV != null) {mVV.enterBackground();}super.onStop();}@Overrideprotected 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,里面还有很多方法。)
Android RecyclerView复杂布局 实现多Item,item中含视频文件播放相关推荐
- Android VideoView播放 项目中的 视频文件 自动横屏 全屏播放
记录最近遇到的一个android播放视频的需求: APP主页上方有一个操作演示字样的入口,点击后开始播放一段视频,视频文件是放在工程里的. 话说以前还没做过类似播放视频的功能,根据以往的经验来看,最简 ...
- Android RecyclerView网格布局动画
In this tutorial, we'll learn how to create animation for a RecyclerView in which elements are displ ...
- android视频播放指定位置,android – 如何在某个特定位置的视图中查看视频?
我目前正在试图实施一个视频视图,以便在特定的位置显示一个视频.我可以显示一个全屏视频没有问题.然而,无论何时我尝试在框架(例如一个小矩形)中显示视频,我只能在该视图中显示一部分视频.我无法将视频放入该 ...
- Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
使用RecyclerView水平滑动显示item,一个item占整个屏幕宽度, 所以基本写法水平滑动不会一个item一个item的显示完整,而是各自显示一部分.因此这个不是我们想要的结果.效果就是像广 ...
- android 分割线布局,Android RecyclerView网格布局(支持多种分割线)详解(2)
记录了下RecyclerView的使用方法,并且讲述了线性布局列表的使用方法,在此基础上加上了万能分割线,支持颜色分割线和图片分割线,同时支持对分割线设置线宽. 这篇是总结一下网格布局的使用,同样也支 ...
- Android recyclerView 多布局
1.首先引入我们的RecyclerView的包 2.在布局文件中使用他 <android.support.v7.widget.RecyclerView android:id="@+id ...
- android recyclerview多布局_图文讲解RecyclerView的复用机制 ||Recyclerview进阶
码个蛋(codeegg) 第 1085 次推 作者:susion 博客地址:https://juejin.im/post/5c1369cff265da613b6fa87f 本文是RecyclerVie ...
- android RecyclerView 九宫格布局上下均分
今天有人问到这方面问题,趁着礼拜天 分享给大家 ,直接上代码 首先先将下面的复制的你的代码中 public class ItemOffsetDecoration extends RecyclerVie ...
- android倒计时框_在提示框中:视频游戏播放时间,维修电脑鼠标和极简主义的Android计时器...
android倒计时框 Once a week we round up some great reader tips and share them with everyone. This week w ...
最新文章
- 【摄像头】低照度和光圈
- 怎样在javascript函数中将变量传递给服务端脚本程序?
- java 月第一天_java获取当前月第一天和最后一天
- 机器学习算法如何调参?这里有一份神经网络学习速率设置指南
- ArrayList原理分析(重点在于扩容)
- 推荐一款最好用Mysql数据库客户端
- LeetCode:Length of Last Word
- 【Vue Laravel-mix】Error with Vue lazy loading components: “Failed to resolve async component“
- linux驱动开发---并发控制
- mysql 时间差_后端从mysql取值返回0时区时间数据的问题
- C++提高部分_C++类模板成员函数类外实现---C++语言工作笔记092
- 程序员代码面试指南——笔记1
- C++ stack的使用及模拟实现
- 无盘服务器 显卡,我也来说说网吧配机器该用什么显卡
- 【抓包】【Mac Charles】局域网无法抓包 手机热点来解决
- 学习笔记——VLSI测试方法学和可测性设计
- 新版Q绑查询HTML源码
- java国际化转换_java 实现国际化 中英文语言切换
- 关于电脑任务栏软件图标变成白色白纸的解决办法
- 【自然语言处理】ChatGPT 相关核心算法