Android实战(橘子娱乐)-首页(第四篇 MainRecyclerViewAdapter数据与布局的绑定)

版权声明:欢迎分享,但请注明出处,谢谢 https://blog.csdn.net/qq_28057577/article/details/78249131
 前言:
        前面几篇文章对MVP的基本搭建、首页的xml布局、MainActivity类的逻辑代码进行了简单的学习,在上一篇  Android实战(橘子娱乐)-首页(第三篇  IRecyclerView自定义刷新头ClassicRefreshHeaderView和SharedPreferencesUtils)中提到我们这一篇文章会讲解一下如何将数据和布局绑定在一起。数据我们先不讲从哪儿获取因为那是MVP中Model的工作,我们只要知道数据由Presenter为我们提供就好,布局是什么呢,就是就是我们的多布局RecyclerView,我们需要通过不同的布局类型加载不同的布局显示不同的数据,如果对我说的不是很理解,可以去=网上看看RecyclerView的基本使用,这里就不讲解了。

  首页截图:
     
    截图上有三类布局,当然底部还有一种布局
 
所以,算起来一共是四类布局,每一类布局显示不同的数据和布局,不多少上代码:
    
    
  1. package com.andy.orange.adapter;
  2. import android.content.Context;
  3. import android.support.v7.widget.RecyclerView;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.ImageView;
  8. import android.widget.RelativeLayout;
  9. import android.widget.TextView;
  10. import android.widget.Toast;
  11. import com.andy.orange.R;
  12. import com.andy.orange.bean.Film;
  13. import com.andy.orange.utils.GlideLoader;
  14. import com.andy.orange.utils.ImageLoaderUtils;
  15. import com.youth.banner.Banner;
  16. import com.youth.banner.BannerConfig;
  17. import com.youth.banner.Transformer;
  18. import com.youth.banner.listener.OnBannerListener;
  19. import java.util.ArrayList;
  20. import java.util.List;
  21. /**
  22. * Created by Andy Lau on 2017/8/9.
  23. */
  24. public class MainRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
  25. private onItemClickListener mOnItemClickListener;
  26. private final Context context;
  27. private final LayoutInflater inflater;
  28. private List<Film.SubjectsBean> list;
  29. private static final int TYPE_BANNER = 0;
  30. private static final int TYPE_MOVIE_DES = 1;
  31. private static final int TYPE_MOVIE_DETAIL = 2;
  32. private static final int TYPE_FOOT =3;
  33. private List<String> mImages = new ArrayList<>();
  34. public MainRecyclerViewAdapter(Context context, List<Film.SubjectsBean> list) {
  35. this.context = context;
  36. this.inflater = LayoutInflater.from(context);
  37. this.list = list;
  38. }
  39. @Override
  40. public int getItemViewType(int position) {
  41. if (position == 0) {
  42. return TYPE_BANNER;
  43. } else if (position == 1) {
  44. return TYPE_MOVIE_DES;
  45. } else if(position== list.size()+2){
  46. return TYPE_FOOT;
  47. }else {
  48. return TYPE_MOVIE_DETAIL;
  49. }
  50. }
  51. @Override
  52. public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  53. switch (viewType) {
  54. case TYPE_BANNER:
  55. return new BannerViewHolder(inflater.inflate(R.layout.item_home_banner, parent, false));
  56. case TYPE_MOVIE_DES:
  57. return new MovieDesViewHolder(inflater.inflate(R.layout.item_home_movie_title, parent, false));
  58. case TYPE_MOVIE_DETAIL:
  59. return new MovieDetailViewHolder(inflater.inflate(R.layout.item_movie, parent, false));
  60. case TYPE_FOOT:
  61. return new BottomViewHolder(inflater.inflate(R.layout.item_home_bottom, parent, false));
  62. }
  63. return null;
  64. }
  65. @Override
  66. public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  67. if (holder instanceof BannerViewHolder) {
  68. setBannerItemValues((BannerViewHolder) holder, position);
  69. } else if (holder instanceof MovieDetailViewHolder) {
  70. setMovieDetailItemValues((MovieDetailViewHolder) holder, position);
  71. }
  72. }
  73. private void setMovieDetailItemValues(final MovieDetailViewHolder holder, final int position) {
  74. Film.SubjectsBean filmItem=list.get(position-2);
  75. //获取评分
  76. Double score=filmItem.getRating().getAverage();
  77. //获取标题
  78. String title=filmItem.getTitle();
  79. //获取海报图片路径
  80. String poster=filmItem.getImages().getLarge();
  81. holder.mTvRating.setText(score+"");
  82. holder.mTvMovieName.setText(title);
  83. //glide显示poster
  84. ImageLoaderUtils.display(context, holder.mIvPhoto, poster);
  85. holder.mRlRoot.setOnClickListener(new View.OnClickListener() {
  86. @Override
  87. public void onClick(View v) {
  88. mOnItemClickListener.onItemClick(position-2,holder.mIvPhoto);
  89. }
  90. });
  91. }
  92. /*
  93. * 设置顶部banner的数据
  94. * */
  95. private void setBannerItemValues(final BannerViewHolder holder, int position) {
  96. //将前4个的海报设置到banner里面
  97. if (mImages.size() == 0 && list.size() >= 4) {
  98. for (int i = 0; i < 4; i++) {
  99. Film.SubjectsBean info = list.get(i);
  100. mImages.add(info.getImages().getLarge());
  101. }
  102. }
  103. holder.mBanner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);
  104. holder.mBanner.setImageLoader(new GlideLoader());
  105. holder.mBanner.setImages(mImages);
  106. holder.mBanner.setBannerAnimation(Transformer.DepthPage);
  107. holder.mBanner.isAutoPlay(true);
  108. holder.mBanner.setDelayTime(3000);
  109. holder.mBanner.setIndicatorGravity(BannerConfig.CENTER);
  110. holder.mBanner.start();
  111. holder.mBanner.setOnBannerListener(new OnBannerListener() {
  112. @Override
  113. public void OnBannerClick(int position) {
  114. Toast.makeText(context,"movie——>"+list.get(position).getTitle(),Toast.LENGTH_SHORT).show();
  115. }
  116. });
  117. }
  118. @Override
  119. public int getItemCount() {
  120. return list.size() + 3;
  121. }
  122. /**
  123. * banner视图映射
  124. * */
  125. public class BannerViewHolder extends RecyclerView.ViewHolder {
  126. private Banner mBanner;
  127. public BannerViewHolder(View itemView) {
  128. super(itemView);
  129. mBanner = (Banner) itemView.findViewById(R.id.banner_home);
  130. }
  131. }
  132. /**
  133. * 热门电影标题和跟多的视图映射
  134. * */
  135. public class MovieDesViewHolder extends RecyclerView.ViewHolder {
  136. private TextView mTvMore;
  137. public MovieDesViewHolder(View itemView) {
  138. super(itemView);
  139. mTvMore = (TextView) itemView.findViewById(R.id.tv_more);
  140. mTvMore.setOnClickListener(new View.OnClickListener() {
  141. @Override
  142. public void onClick(View v) {
  143. Toast.makeText(context,"movie more!",Toast.LENGTH_SHORT).show();
  144. }
  145. });
  146. }
  147. }
  148. /**
  149. * 单个电影海报的视图映射
  150. * */
  151. public class MovieDetailViewHolder extends RecyclerView.ViewHolder {
  152. private ImageView mIvPhoto;
  153. private RelativeLayout mRlRoot;
  154. private TextView mTvRating;
  155. private TextView mTvMovieName;
  156. public MovieDetailViewHolder(View itemView) {
  157. super(itemView);
  158. mIvPhoto = (ImageView) itemView.findViewById(R.id.iv_photo);
  159. mTvRating = (TextView) itemView.findViewById(R.id.tv_rating);
  160. mTvMovieName = (TextView) itemView.findViewById(R.id.tv_name);
  161. mRlRoot = (RelativeLayout) itemView.findViewById(R.id.rl_root);
  162. }
  163. }
  164. public class BottomViewHolder extends RecyclerView.ViewHolder {
  165. public BottomViewHolder(View itemView) {
  166. super(itemView);
  167. }
  168. }
  169. public interface onItemClickListener{
  170. void onItemClick(int position,ImageView imageView);
  171. }
  172. public void setOnItemClickListener(onItemClickListener onItemClickListener){
  173. this.mOnItemClickListener = onItemClickListener;
  174. }
  175. }
    ViewHolder对效率的优化我们就不讲了,RecyclerView Adapter的主要方法: getViewItemType() getItemCount()   onCreateViewHolder ( ViewGroup  parent ,   int  viewType )、  onBindViewHolder ( RecyclerView . ViewHolder  holder ,   int  position )
getViewItemType() 的作用是根据位置设置返回显示view的类型,我们上面主要有4种ViewType: TYPE_BANNER 、  TYPE_MOVIE_DES  、 TYPE_FOOT 、  TYPE_MOVIE_DETAIL getItemCount() 中返回总的item个数,至于为啥是 list . size () + 3 自己想想就能明白的, 然后是   onCreateViewHolder ( ViewGroup  parent ,   int  viewType ) ,在这个方法里面我们会根据不同的Type去加载不同的布局并返回不同的viewHolder ;最后在 onBindViewHolder ( RecyclerView . ViewHolder  holder ,   int  position ) 中我们根据不同的viewHolder将数据list绑定到布局中显示。
    接下来贴出四种布局的xml布局,都是一些简单的布局:
(item_home_banner.xml)
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <com.youth.banner.Banner xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/banner_home"
  4. android:layout_width="match_parent"
  5. android:layout_height="180dp" />
(item_home_movie_title.xml)
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_marginTop="5dp"
  4. android:paddingBottom="5dp"
  5. android:paddingTop="5dp"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content">
  8. <ImageView
  9. android:id="@+id/iv_hot_hint"
  10. android:layout_alignParentLeft="true"
  11. android:layout_alignParentTop="true"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:src="@drawable/hot"/>
  15. <TextView
  16. android:textSize="16sp"
  17. android:textColor="@color/black"
  18. android:layout_toRightOf="@+id/iv_hot_hint"
  19. android:layout_marginLeft="5dp"
  20. android:layout_alignParentTop="true"
  21. android:layout_marginTop="10dp"
  22. android:id="@+id/tv_name_rec"
  23. android:layout_width="wrap_content"
  24. android:layout_height="wrap_content"
  25. android:text="热门TOP · 电影"/>
  26. <TextView
  27. android:layout_marginRight="5dp"
  28. android:id="@+id/tv_more"
  29. android:layout_width="wrap_content"
  30. android:layout_height="wrap_content"
  31. android:text="更多"
  32. android:layout_marginTop="10dp"
  33. android:layout_alignParentRight="true"
  34. android:layout_alignParentTop="true"/>
  35. </RelativeLayout>
(item_movie.xml)
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. android:id="@+id/rl_root"
  5. android:layout_marginBottom="5dp"
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content">
  8. <android.support.v7.widget.CardView
  9. android:id="@+id/movies_info"
  10. android:layout_width="match_parent"
  11. android:layout_height="240dp"
  12. android:layout_margin="4dp"
  13. android:clickable="false"
  14. app:cardCornerRadius="5dp"
  15. app:cardElevation="8dp">
  16. <FrameLayout
  17. android:layout_width="match_parent"
  18. android:layout_height="match_parent">
  19. <ImageView
  20. android:id="@+id/iv_photo"
  21. android:layout_width="match_parent"
  22. android:layout_height="match_parent"
  23. android:adjustViewBounds="true"
  24. android:scaleType="centerCrop"
  25. android:transitionName="@string/transition_movie_photos"/>
  26. <TextView
  27. android:textSize="18sp"
  28. android:padding="5dp"
  29. android:textColor="@color/accent_material_light"
  30. android:layout_gravity="left|bottom"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:id="@+id/tv_rating"
  34. android:text="5.6"/>
  35. </FrameLayout>
  36. </android.support.v7.widget.CardView>
  37. <TextView
  38. android:maxLines="1"
  39. android:ellipsize="end"
  40. android:id="@+id/tv_name"
  41. android:textSize="16sp"
  42. android:layout_marginTop="5dp"
  43. android:textColor="@color/accent_material_light"
  44. android:layout_marginLeft="10dp"
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:layout_below="@+id/movies_info"
  48. android:layout_marginBottom="5dp"
  49. android:text="Forrest Gump"/>
  50. </RelativeLayout>
(item_home_bottom.xml)
     
     
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_marginTop="10dp"
  4. android:layout_marginBottom="10dp"
  5. android:padding="5dp"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content">
  8. <ImageView
  9. android:background="@color/accent_material_light"
  10. android:layout_gravity="center"
  11. android:layout_width="match_parent"
  12. android:layout_height="1dp"/>
  13. <com.andy.orange.widget.SuperTextView
  14. android:layout_gravity="center"
  15. android:gravity="center"
  16. android:layout_width="wrap_content"
  17. android:layout_height="match_parent"
  18. android:textColor="@color/black"
  19. android:text="我是有底线的"/>
  20. </FrameLayout>
在上面的布局和代码中,我们主要说一下 com.youth.banner.Banner 这个开源轮播组件的使用, MainRecyclerViewAdapter 中的代码如下:
     
     
  1. //设置圆点指示器
  2. holder.mBanner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR);
  3. //设置图片加载框架
  4. holder.mBanner.setImageLoader(new GlideLoader());
  5. //设置图片路径List
  6. holder.mBanner.setImages(mImages);
  7. //设置banner动画
  8. holder.mBanner.setBannerAnimation(Transformer.DepthPage);
  9. //设置自动播放
  10. holder.mBanner.isAutoPlay(true);
  11. //设置延迟
  12. holder.mBanner.setDelayTime(3000);
  13. //设置指示器位置
  14. holder.mBanner.setIndicatorGravity(BannerConfig.CENTER);
  15. //启动
  16. holder.mBanner.start();
  17. //设置点击监听
  18. holder.mBanner.setOnBannerListener(new OnBannerListener() {
  19. @Override
  20. public void OnBannerClick(int position) {
  21. Toast.makeText(context,"movie——>"+list.get(position).getTitle(),Toast.LENGTH_SHORT).show();
  22. }
  23. });
    注释写的很清楚,但是不细,推荐看看  轮子系列:一款能用易用好用的Android图片轮播轮子 ;上面可以看出我们的数据是mImages这个list,我们先不管他那儿来的,我们学习presenter的时候就自然明白了,主要是 new GlideLoader()这里面是怎样的,我们来看看:
      
      
  1. package com.andy.orange.utils;
  2. import android.content.Context;
  3. import android.widget.ImageView;
  4. import com.youth.banner.loader.ImageLoader;
  5. /**
  6. * Created by Andy lau on 2017/8/14.
  7. */
  8. public class GlideLoader extends ImageLoader {
  9. @Override
  10. public void displayImage(Context context, Object path, ImageView imageView) {
  11. ImageLoaderUtils.display(context,imageView,(String)path);
  12. }
  13. }
    惊恐脸~~~~,这么少。。。,他就是继承了ImageLoader然后实现了 displayImage()这个 展示图片的方法,然后我们交给了 ImageLoaderUtils 去实现,不不仅这里用到了ImageLoaderUtils,MainRecyclerViewAdapter其他地方也用到了,他的作用就是通过获取数据获取到的图片链接string值转成实实在在的图片显示到布局中去,那么 ImageLoaderUtils 的实现具体实现是怎样的呢??? 由于篇幅太长我们还是留在下一篇中进行学习吧!恩,就这样!
       

猜你喜欢

转载自blog.csdn.net/qq_28057577/article/details/78249131