SlideVideoAdapter.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. package com.edufound.reader.adapter;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.graphics.Rect;
  6. import android.os.Build;
  7. import android.os.Message;
  8. import android.view.LayoutInflater;
  9. import android.view.MotionEvent;
  10. import android.view.View;
  11. import android.view.ViewGroup;
  12. import android.widget.CompoundButton;
  13. import android.widget.FrameLayout;
  14. import android.widget.HorizontalScrollView;
  15. import android.widget.ImageView;
  16. import android.widget.LinearLayout;
  17. import android.widget.Switch;
  18. import android.widget.TextView;
  19. import com.edufound.reader.R;
  20. import com.edufound.reader.bean.ChannelCodeEnum;
  21. import com.edufound.reader.bean.CommentListBean;
  22. import com.edufound.reader.bean.HttpResultBean;
  23. import com.edufound.reader.bean.HttpResultDataListBean;
  24. import com.edufound.reader.bean.UserRecordBean;
  25. import com.edufound.reader.cusview.RvListJzvdStd;
  26. import com.edufound.reader.util.Consts;
  27. import com.edufound.reader.util.EfunboxUtil;
  28. import com.edufound.reader.util.GlideUtils;
  29. import com.edufound.reader.util.OkHttpClient;
  30. import com.edufound.reader.util.SizeUtils;
  31. import com.edufound.reader.videoutil.JZMediaIjk;
  32. import com.google.gson.reflect.TypeToken;
  33. import com.okhttplib.HttpInfo;
  34. import com.okhttplib.callback.Callback;
  35. import com.orhanobut.logger.Logger;
  36. import java.io.IOException;
  37. import java.util.List;
  38. import androidx.annotation.NonNull;
  39. import androidx.annotation.RequiresApi;
  40. import androidx.recyclerview.widget.RecyclerView;
  41. import cn.jzvd.JZDataSource;
  42. import cn.jzvd.JzvdStd;
  43. public class SlideVideoAdapter extends RecyclerView.Adapter<VideoHolder> {
  44. private LayoutInflater mLayoutInflater;
  45. private Activity mContext;
  46. private List<UserRecordBean> mListData;
  47. public SlideVideoAdapter(Activity context, @NonNull List<UserRecordBean> data) {
  48. mContext = context;
  49. mLayoutInflater = LayoutInflater.from(context);
  50. this.mListData = data;
  51. }
  52. public void addMored(List<UserRecordBean> listData) {
  53. mListData.addAll(listData);
  54. }
  55. public String getItemTag(int position) {
  56. return mListData.get(position).getUserRead().getTag();
  57. }
  58. @NonNull
  59. @Override
  60. public VideoHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  61. return new VideoHolder(mContext, mLayoutInflater.inflate(R.layout.adapter_item_slidevideo, parent, false));
  62. }
  63. @Override
  64. public void onBindViewHolder(@NonNull VideoHolder holder, @SuppressLint("RecyclerView") int position) {
  65. // holder.mVideo.setUp(new JZDataSource(mListData.get(position).getUserRead().getVideoPath()), JzvdStd.SCREEN_FULLSCREEN);
  66. holder.mVideo.setUp(new JZDataSource(mListData.get(position).getUserRead().getVideoPath()), JzvdStd.SCREEN_FULLSCREEN, JZMediaIjk.class, mListData.get(position).getUserRead().getId());
  67. if (!Consts.getUMengChannel().equals(ChannelCodeEnum.BAIDU.getChannelCode())) {
  68. GlideUtils.loadImageSizeKipMemoryCache(mContext, mListData.get(position).getUserRead().getCoverImg(), holder.mVideo.posterImageView);
  69. }
  70. holder.mVideo.startPreloading();
  71. /**
  72. * type=READ(用户朗读的)
  73. * type=EXAMPLE(官方的)
  74. * */
  75. holder.mItemView.setTag(mListData.get(position).getUserRead().getType());
  76. holder.itemView.setTag(mListData.get(position).getUserRead().getType());
  77. boolean needDanMu = false;
  78. boolean needTag = false;
  79. int tagType = -1;
  80. String tagText = "";
  81. if (!mListData.get(position).getUserRead().getTag().equals("ACTIVITY")) {
  82. needDanMu = true;
  83. }
  84. if (mListData.get(position).getUserRead().getTag().equals("READ")) {
  85. //是用户朗读的和官方作品
  86. needTag = false;
  87. tagText = "";
  88. } else if (mListData.get(position).getUserRead().getTag().equals("ACTIVITY")) {
  89. //是活动,判断活动类型
  90. Logger.e("mListData.get(position).getUserRead().getActivityType():" + mListData.get(position).getUserRead().getActivityType());
  91. switch (Integer.valueOf(mListData.get(position).getUserRead().getActivityType())) {
  92. case 1:
  93. //小红花,加载webview
  94. case 2:
  95. //抵用券,加载webview
  96. holder.mEventFrame.setVisibility(View.VISIBLE);
  97. holder.mEventFrame.setOnClickListener(new View.OnClickListener() {
  98. @Override
  99. public void onClick(View v) {
  100. Logger.e("mListData.get(position).getUserRead().getActivityId():" + mListData.get(position).getUserRead().getActivityId());
  101. EfunboxUtil.toWebFlowerActivity(mContext, mListData.get(position).getUserRead().getActivityUrl(), mListData.get(position).getUserRead().getActivityId());
  102. }
  103. });
  104. break;
  105. case 3:
  106. //优秀作品或者是竞赛,跳转活动tab并且定位
  107. holder.mEventFrame.setVisibility(View.VISIBLE);
  108. holder.mEventFrame.setOnClickListener(new View.OnClickListener() {
  109. @Override
  110. public void onClick(View v) {
  111. Logger.e("mListData.get(position).getUserRead().getActivityType():" + mListData.get(position).getUserRead().getActivityType());
  112. Consts.setEventPosition(Integer.valueOf(mListData.get(position).getUserRead().getActivityNumber()));
  113. Intent intent = new Intent("com.edufound.reader.main.setindex");
  114. mContext.sendBroadcast(intent);
  115. }
  116. });
  117. break;
  118. default:
  119. holder.mEventFrame.setVisibility(View.GONE);
  120. break;
  121. }
  122. holder.mSwitch.setVisibility(View.INVISIBLE);
  123. needTag = true;
  124. tagText = "活动";
  125. tagType = 1;
  126. } else if (mListData.get(position).getUserRead().getTag().equals("HOT")) {
  127. //热播作品
  128. needTag = true;
  129. tagText = "热播";
  130. tagType = 2;
  131. } else if (mListData.get(position).getUserRead().getTag().equals("NEW")) {
  132. //新作品
  133. needTag = true;
  134. tagText = "新作品";
  135. tagType = 3;
  136. } else if (mListData.get(position).getUserRead().getTag().equals("EXCELLENT")) {
  137. //优秀作品
  138. needTag = true;
  139. tagText = "优秀作品";
  140. tagType = 4;
  141. } else if (mListData.get(position).getUserRead().getTag().equals("EXAMPLE")) {
  142. needTag = true;
  143. tagText = "官方作品";
  144. tagType = 5;
  145. }
  146. if (needDanMu) {
  147. holder.initDanMu(mListData.get(position).getUserRead().getId());
  148. holder.mSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
  149. @Override
  150. public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
  151. if (b) {
  152. holder.mMarqueen.setVisibility(View.VISIBLE);
  153. // holder.mMarqueen.start();
  154. } else {
  155. holder.mMarqueen.setVisibility(View.INVISIBLE);
  156. // holder.mMarqueen.stop();
  157. }
  158. }
  159. });
  160. }
  161. if (needTag) {
  162. holder.mTagLayout.removeAllViews();
  163. ImageView tagImg = new ImageView(mContext);
  164. tagImg.setLayoutParams(new FrameLayout.LayoutParams(new LinearLayout.LayoutParams(SizeUtils.dp2px(mContext, 142), SizeUtils.dp2px(mContext, 36))));
  165. Logger.e("tagType:" + tagType);
  166. switch (tagType) {
  167. case 1:
  168. //活动
  169. GlideUtils.loadImage(mContext, R.drawable.tag_activity, tagImg);
  170. break;
  171. case 2:
  172. //热播
  173. GlideUtils.loadImage(mContext, R.drawable.tag_hot, tagImg);
  174. break;
  175. case 3:
  176. //新作品
  177. GlideUtils.loadImage(mContext, R.drawable.tag_new, tagImg);
  178. break;
  179. case 4:
  180. //优秀作品
  181. GlideUtils.loadImage(mContext, R.drawable.tag_excellent, tagImg);
  182. break;
  183. case 5:
  184. //官方作品
  185. GlideUtils.loadImage(mContext, R.drawable.tag_example, tagImg);
  186. break;
  187. }
  188. holder.mTagLayout.addView(tagImg);
  189. holder.mTagLayout.setVisibility(View.VISIBLE);
  190. }
  191. // holder.mVideo.posterImageView.setImageURI(Uri.parse(mListData.get(position).videoUrl));
  192. }
  193. @Override
  194. public void onViewDetachedFromWindow(@NonNull VideoHolder holder) {
  195. super.onViewDetachedFromWindow(holder);
  196. // holder.mSwitch.setChecked(false);
  197. holder.moveHandler.removeMessages(1);
  198. holder.handlerRunning = false;
  199. }
  200. @Override
  201. public void onViewAttachedToWindow(@NonNull VideoHolder holder) {
  202. super.onViewAttachedToWindow(holder);
  203. if (holder.mScrollView != null) {
  204. holder.handlerRunning = true;
  205. holder.moveHandler.sendEmptyMessageDelayed(1, holder.mScrollViewMovedelayMillis);
  206. }
  207. }
  208. @Override
  209. public int getItemCount() {
  210. return mListData.size();
  211. }
  212. @Override
  213. public int getItemViewType(int position) {
  214. return position;
  215. }
  216. }
  217. class VideoHolder extends RecyclerView.ViewHolder {
  218. public View mItemView;
  219. public RvListJzvdStd mVideo;
  220. public LinearLayout mMarqueen;
  221. public Switch mSwitch;
  222. public FrameLayout mEventFrame;
  223. public FrameLayout mTagLayout;
  224. public FrameLayout mNotClickFrame;
  225. public Activity mContext;
  226. public HorizontalScrollView mScrollView;
  227. public int mScrollViewMovedelayMillis = 50;
  228. public boolean handlerRunning = false;
  229. public VideoHolder(Activity context, @NonNull View itemView) {
  230. super(itemView);
  231. mContext = context;
  232. mItemView = itemView;
  233. mVideo = itemView.findViewById((R.id.slidevideo_video));
  234. mNotClickFrame = itemView.findViewById(R.id.adapter_item_slidevideo_danmu_bg);
  235. mSwitch = itemView.findViewById(R.id.slidevideo_video_switch);
  236. mEventFrame = itemView.findViewById(R.id.adapter_item_slidevideo_event_frame);
  237. mTagLayout = itemView.findViewById(R.id.adapter_item_slidevideo_tagLayout);
  238. mTagLayout.setVisibility(View.GONE);
  239. mEventFrame.setVisibility(View.GONE);
  240. mSwitch.setVisibility(View.INVISIBLE);
  241. mMarqueen = itemView.findViewById(R.id.slidevideo_video_marqueen);
  242. mSwitch.setChecked(true);
  243. if (mSwitch.isChecked()) {
  244. mMarqueen.setVisibility(View.VISIBLE);
  245. if (mScrollView != null) {
  246. moveHandler.sendEmptyMessageDelayed(1, mScrollViewMovedelayMillis);
  247. }
  248. } else {
  249. mMarqueen.setVisibility(View.INVISIBLE);
  250. if (mScrollView != null) {
  251. moveHandler.removeMessages(1);
  252. }
  253. }
  254. mNotClickFrame.setOnTouchListener(new View.OnTouchListener() {
  255. @Override
  256. public boolean onTouch(View v, MotionEvent event) {
  257. return true;
  258. }
  259. });
  260. }
  261. public void initDanMu(String exampleId) {
  262. OkHttpClient.doGetAsync(mContext, new HttpInfo.Builder().setUrl(Consts.getFinalApi() + "/posts/list").addParam("columnId", exampleId).addParam("pageNo", String.valueOf(1)).addParam("pageSize", "100"), new Callback() {
  263. @RequiresApi(api = Build.VERSION_CODES.M)
  264. @Override
  265. public void onSuccess(HttpInfo info) throws IOException {
  266. HttpResultBean<HttpResultDataListBean<CommentListBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<HttpResultDataListBean<CommentListBean>>>() {
  267. }.getType());
  268. if (bean.getData().getList() == null || bean.getData().getList().size() == 0) {
  269. mSwitch.setVisibility(View.INVISIBLE);
  270. return;
  271. }
  272. mSwitch.setVisibility(View.VISIBLE);
  273. boolean isNeedAdd = false;
  274. List<CommentListBean> list = null;
  275. if (bean.getData().getList().size() < 6) {
  276. list = bean.getData().getList();
  277. isNeedAdd = true;
  278. }
  279. if (isNeedAdd) {
  280. for (int i = 0; i < 3; i++) {
  281. bean.getData().getList().addAll(list);
  282. }
  283. }
  284. for (int i = 0; i < bean.getData().getList().size(); i++) {
  285. FrameLayout layout = (FrameLayout) LayoutInflater.from(mContext).inflate(R.layout.slide_video_marqueen_item, null, false);
  286. TextView tv = layout.findViewById(R.id.item_marqueen_text);
  287. tv.setText(bean.getData().getList().get(i).getDetailDesc());
  288. mMarqueen.addView(layout);
  289. }
  290. mScrollView = (HorizontalScrollView) mMarqueen.getParent();
  291. mScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
  292. @Override
  293. public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
  294. View view = ((HorizontalScrollView) v).getChildAt(0);
  295. //判断是否滑动栏到底了,如果是,就让iv这个图片隐藏,否则显示
  296. if (view.getMeasuredWidth() <= v.getScrollX() + v.getWidth()) {
  297. //滑动到底部了
  298. mScrollView.postDelayed(new Runnable() {
  299. @Override
  300. public void run() {
  301. mScrollView.scrollTo(0, 0);
  302. }
  303. }, 2000);
  304. } else {
  305. }
  306. }
  307. });
  308. mScrollView.setOnTouchListener(new View.OnTouchListener() {
  309. @Override
  310. public boolean onTouch(View v, MotionEvent event) {
  311. return true;
  312. }
  313. });
  314. mMarqueen.postDelayed(new Runnable() {
  315. @Override
  316. public void run() {
  317. if (!handlerRunning) {
  318. moveHandler.sendEmptyMessageDelayed(1, mScrollViewMovedelayMillis);
  319. }
  320. }
  321. }, 500);
  322. // SlideVideoDanMarqueenAdapter adapter = new SlideVideoDanMarqueenAdapter(mContext, bean.getData().getList());
  323. // mMarqueen.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, true));
  324. // mMarqueen.addItemDecoration(new SpacesItemDecoration(SizeUtils.dp2px(mContext, 23)));
  325. // mMarqueen.setAdapter(adapter);
  326. }
  327. @Override
  328. public void onFailure(HttpInfo info) throws IOException {
  329. Logger.e("获取弹幕失败:" + info.getRetDetail());
  330. }
  331. });
  332. }
  333. android.os.Handler moveHandler = new android.os.Handler(new android.os.Handler.Callback() {
  334. @Override
  335. public boolean handleMessage(@NonNull Message msg) {
  336. switch (msg.what) {
  337. case 1:
  338. mScrollView.scrollBy(2, 0);
  339. moveHandler.sendEmptyMessageDelayed(1, mScrollViewMovedelayMillis);
  340. break;
  341. }
  342. return false;
  343. }
  344. });
  345. }
  346. class SpacesItemDecoration extends RecyclerView.ItemDecoration {
  347. private int space;
  348. public SpacesItemDecoration(int space) {
  349. this.space = space;
  350. }
  351. @Override
  352. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
  353. outRect.left = space;
  354. outRect.right = space;
  355. // outRect.bottom = space;
  356. // Add top margin only for the first item to avoid double space between items
  357. }
  358. }