高仿各大商城首页---使用分类型的RecyclerView来实现
来源:互联网 发布:网络八大超白金作家 编辑:程序博客网 时间:2024/04/30 21:29
上一篇我们做了一个高仿各大商城的引导页,那今天让我继续。
正所谓,一入商城深似海~
商城类的App,确实是有许多东西值得学习,但是只要略微斟酌一下,你又会发现,它们之间存在着许多不谋而合的相似,也就是所谓的雷同~既然如此,让我们也来接下地气,先从一个简单的首页做起吧~
实现的效果如下图:
准备:
①build.gradle文件需要添加的依赖:
compile 'com.jakewharton:butterknife:7.0.1' compile 'com.android.support:recyclerview-v7:25.0.1' compile 'com.zhy:okhttputils:2.6.2' compile 'com.alibaba:fastjson:1.2.21' compile 'com.youth.banner:banner:1.4.4' compile 'com.github.bumptech.glide:glide:3.7.0'
②相关的联网权限不要忘了!
现在正式开始吧:
1.大布局就是一个简单的RecyclerView:
<android.support.v7.widget.RecyclerView android:id="@+id/rv_home" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@id/titlebar" />
2.接着我们就要实例化RecyclerView,并设置适配器了。
但是在设置适配器之前我们要先准备好数据,这里我们使用okhttputils进行联网请求数据,并使用fastJson进行解析:
(注:bean类WomenBean直接使用GsonFormat生成)
/** * 使用okhttpUtils进行联网请求数据 */ private void getDataFromNet() { String url = "http://api.funwear.com/mbfun_server/index.php?m=Home&a=getAppLayoutV2&page=home&cid=2&deviceCode=00000000-6469-5d7a-ffff-ffff99d603a9&osCode=android&osVersion=19&deviceId=00000000-6469-5d7a-ffff-ffff99d603a9&token=&source=android&version=v4.2.2&osName=HTC+M8t&appName=youfanguanfang"; OkHttpUtils. get() .url(url) .build() .execute(new StringCallback() { @Override public void onError(okhttp3.Call call, Exception e, int id) { Log.e("TAG", "联网失败" + e.getMessage()); } @Override public void onResponse(String response, int id) { Log.e("TAG", "联网成功==" + response); //联网成功后使用fastjson解析 processData(response); } }); }
// fastjson解析数据 private void processData(String json) { JSONObject jsonObject = JSON.parseObject(json); String data = jsonObject.getString("data"); JSONObject jsonData = JSON.parseObject(data); String module = jsonData.getString("module"); List<WomenBean.WomenData.ModuleBean> moduleBeanList = parseArray(module, WomenBean.WomenData.ModuleBean.class); //测试是否解析数据成功 //String strTest=moduleBeanList.get(0).getC_title(); //Log.e("TAG",strTest); if (moduleBeanList != null) { //有数据 //设置适配器 homeRecycleAdapter = new HomeRecycleViewAdapter(mContext, moduleBeanList); rvHome.setAdapter(homeRecycleAdapter); //recycleView不仅要设置适配器还要设置布局管理者,否则图片不显示 //第一个参数是上下文,第二个参数是只有一列 GridLayoutManager manager = new GridLayoutManager(getActivity(), 1); rvHome.setLayoutManager(manager); } }
3.下面我们就可以来写我们的适配器类(HomeRecyclerViewAdapter.java)了:
让我们先来了解一下各个方法是来干什么的
public class HomeRecycleViewAdapter extends RecyclerView.Adapter { /** * 相当于getView创建ViewHolder布局 * * @param parent * @param viewType 当前的类型 * @return */ @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return null; } /** * 相当于getView中的绑定数据模块 * * @param holder * @param position */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } /** * 总共有多少个item * @return */ @Override public int getItemCount() { //注:这个在开发过程中是从1-->2-->3...慢慢增加的 return 0; } /** *得到类型 */ @Override public int getItemViewType(int position) { return super.getItemViewType(position); }}
4.这里我仅以四种类型为例
/** * 4种类型 */ /** * 类型1:黑色星期五--使用banner实现 */ public static final int BLACK_5_BANNER0 = 0; /** *类型2:今日新品--使用GridView实现 */ public static final int TODAY_NEW_GV1 = 1; /** * 类型3:品牌福利--使用ImageView实现 */ public static final int PIN_PAI_IV2=2; /** * 类型4:搭配趋势--使用RecyclerView实现 */ public static final int DAPEIQS_GV3 =3; /** * 当前类型 */ public int currentType = BLACK_5_BANNER0;
写构造器并传入参数,完善getItemCount() 和 getItemType()方法
/** * 数据对象 */ private final Context mContext; private final List<WomenBean.WomenData.ModuleBean> moduleBeanList; //以后用它来初始化布局 private final LayoutInflater mLayoutInflater; //构造器 public HomeRecycleViewAdapter3(Context mContext, List<WomenBean.WomenData.ModuleBean> moduleBeanList) { this.mContext = mContext; this.moduleBeanList = moduleBeanList; //以后用它来初始化布局 mLayoutInflater = LayoutInflater.from(mContext); } @Override public int getItemCount() { //以后完成后改为4,现在只完成第一种类型暂时写1 return 1; } @Override public int getItemViewType(int position) { switch (position) { case BLACK_5_BANNER0: currentType = BLACK_5_BANNER0; break; case TODAY_NEW_GV1: currentType = TODAY_NEW_GV1; break; case PIN_PAI_IV2: currentType = PIN_PAI_IV2; break; case DAPEIQS_GV3: currentType = DAPEIQS_GV3; break; } return currentType; }
5.下面就来一一实现这四种类型
5.1设置 第1种类型--黑色星期五(使用的是banner)的适配器
@Override public int getItemCount() { //以后完成后改为4,现在只完成第一种类型暂时写1 return 1; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == BLACK_5_BANNER0) { return new BBNViewHolder(mContext, mLayoutInflater.inflate(R.layout.banner_viewpager, null)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == BLACK_5_BANNER0) { BBNViewHolder bbnViewHolder = (BBNViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> module0data = moduleBeanList.get(0).getData(); bbnViewHolder.setData(module0data); } } public class BBNViewHolder extends RecyclerView.ViewHolder { private final Context mContext; private Banner banner; public BBNViewHolder(Context mContext, View itemView) { super(itemView); this.mContext = mContext; banner = (Banner) itemView.findViewById(R.id.banner); } public void setData(List<WomenBean.WomenData.ModuleBean.DataBean> module0data) { //得到图片地址的集合 List<String> imageUrls = new ArrayList<>(); for (int i = 0; i < module0data.size(); i++) { String image = module0data.get(i).getImg(); imageUrls.add(image); } //新版的banner的使用----偷下懒的使用方法 banner.setImages(imageUrls).setImageLoader(new GlideImageLoader()).start(); } } public class GlideImageLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { imageView.setScaleType(ImageView.ScaleType.FIT_XY); //Glide 加载图片简单用法 Glide.with(context).load(path).into(imageView); } }5.2设置 第2种类型--今日新品--(使用GridView实现)的适配器
public class TodayGVAdapter extends BaseAdapter { private final Context mContext; private final List<WomenBean.WomenData.ModuleBean.DataBean> module1data; public TodayGVAdapter(Context mContext, List<WomenBean.WomenData.ModuleBean.DataBean> module1data) { this.mContext = mContext; this.module1data = module1data; } @Override public int getCount() { return module1data == null ? 0 : module1data.size(); } @Override public Object getItem(int i) { return null; } @Override public long getItemId(int i) { return 0; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { ViewHolder holder; if (convertView == null) { //item的布局:垂直线性,ImagView+TextView convertView = View.inflate(mContext, R.layout.item_channel, null); holder = new ViewHolder(); holder.iv_channel = (ImageView) convertView.findViewById(R.id.iv_channel); holder.tv_channel = (TextView) convertView.findViewById(R.id.tv_channel); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } //装配数据 WomenBean.WomenData.ModuleBean.DataBean datasig = module1data.get(position); //使用Glide加载图片 Glide.with(mContext).load(datasig.getImg()).into(holder.iv_channel); //设置文本 holder.tv_channel.setText(datasig.getTitle()); return convertView; } public static class ViewHolder { public ImageView iv_channel; public TextView tv_channel; }}
5.3 第3种类型--品牌福利--(直接使用ImagView)
@Override public int getItemCount() { //以后完成后改为4,现在只完成第3种类型暂时写3 return 3; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == BLACK_5_BANNER0) { return new BBNViewHolder(mContext, mLayoutInflater.inflate(R.layout.banner_viewpager, null)); } else if (viewType == TODAY_NEW_GV1) { return new TODAYViewHolder(mContext, mLayoutInflater.inflate(R.layout.gv_channel, null)); } else if (viewType == PIN_PAI_IV2) { return new PINPAIViewHolder(mContext, mLayoutInflater.inflate(R.layout.iv_pinpai, null)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == BLACK_5_BANNER0) { BBNViewHolder bbnViewHolder = (BBNViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> module0data = moduleBeanList.get(0).getData(); bbnViewHolder.setData(module0data); } else if (getItemViewType(position) == TODAY_NEW_GV1) { TODAYViewHolder todayViewHolder = (TODAYViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> module1data = moduleBeanList.get(1).getData(); todayViewHolder.setData(module1data); } else if (getItemViewType(position) == PIN_PAI_IV2) { PINPAIViewHolder pinpaiViewHolder = (PINPAIViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> pinpai2data = moduleBeanList.get(2).getData(); pinpaiViewHolder.setData(pinpai2data); } } class PINPAIViewHolder extends RecyclerView.ViewHolder { private final Context mContext; @Bind(R.id.iv_new_chok) ImageView ivNewChok; PINPAIViewHolder(Context mContext, View itemView) { super(itemView); this.mContext = mContext; ButterKnife.bind(this, itemView); ivNewChok = (ImageView) itemView.findViewById(R.id.iv_new_chok); } public void setData(List<WomenBean.WomenData.ModuleBean.DataBean> pinpai2data) { //使用Glide加载图片 Glide.with(mContext) .load(pinpai2data.get(0).getImg()) .diskCacheStrategy(DiskCacheStrategy.ALL) .crossFade() //设置淡入淡出效果,默认300ms,可以传参 .into(ivNewChok); } }
5.4设置 第4种类型--搭配趋势--(使用RecyclerView实现)的适配器
@Override public int getItemCount() { //四种类型都已经完成,返回4 return 4; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == BLACK_5_BANNER0) { return new BBNViewHolder(mContext, mLayoutInflater.inflate(R.layout.banner_viewpager, null)); } else if (viewType == TODAY_NEW_GV1) { return new TODAYViewHolder(mContext, mLayoutInflater.inflate(R.layout.gv_channel, null)); } else if (viewType == PIN_PAI_IV2) { return new PINPAIViewHolder(mContext, mLayoutInflater.inflate(R.layout.iv_pinpai, null)); } else if (viewType == DAPEIQS_GV3) { //布局:垂直线性,TextView+RecyclerView return new DaPeiViewHolder(mContext, mLayoutInflater.inflate(R.layout.dapeiqs_rv, null)); } return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (getItemViewType(position) == BLACK_5_BANNER0) { BBNViewHolder bbnViewHolder = (BBNViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> module0data = moduleBeanList.get(0).getData(); bbnViewHolder.setData(module0data); } else if (getItemViewType(position) == TODAY_NEW_GV1) { TODAYViewHolder todayViewHolder = (TODAYViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> module1data = moduleBeanList.get(1).getData(); todayViewHolder.setData(module1data); } else if (getItemViewType(position) == PIN_PAI_IV2) { PINPAIViewHolder pinpaiViewHolder = (PINPAIViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> pinpai2data = moduleBeanList.get(2).getData(); pinpaiViewHolder.setData(pinpai2data); } else if (getItemViewType(position) == DAPEIQS_GV3) { DaPeiViewHolder dapeiViewHolder = (DaPeiViewHolder) holder; List<WomenBean.WomenData.ModuleBean.DataBean> dapeiqs6data = moduleBeanList.get(6).getData(); dapeiViewHolder.setData(dapeiqs6data); } } class DaPeiViewHolder extends RecyclerView.ViewHolder { private final Context mContext; private RecyclerView dapeiqs_rv; public DaPeiViewHolder(Context mContext, View itemView) { super(itemView); this.mContext = mContext; dapeiqs_rv = (RecyclerView) itemView.findViewById(R.id.dapeiqs_rv); } public void setData(List<WomenBean.WomenData.ModuleBean.DataBean> dapeiqs6data) { //1.已有数据 //2.设置适配器 DaPeiQSRecycleViewAdapter adapter = new DaPeiQSRecycleViewAdapter(mContext, dapeiqs6data); dapeiqs_rv.setAdapter(adapter); //recycleView不仅要设置适配器还要设置布局管理者,否则图片不显示 LinearLayoutManager manager = new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false); dapeiqs_rv.setLayoutManager(manager); } }
public class DaPeiQSRecycleViewAdapter extends RecyclerView.Adapter { private final Context mContext; private final List<WomenBean.WomenData.ModuleBean.DataBean> dapeiqs6data; public DaPeiQSRecycleViewAdapter(Context mContext, List<WomenBean.WomenData.ModuleBean.DataBean> dapeiqs6data) { this.mContext = mContext; this.dapeiqs6data = dapeiqs6data; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new MyViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_dapeiqs, null)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MyViewHolder myViewHolder = (MyViewHolder) holder; myViewHolder.setData(position); } @Override public int getItemCount() { return dapeiqs6data.size(); } class MyViewHolder extends RecyclerView.ViewHolder { private ImageView iv_figure; public MyViewHolder(View itemView) { super(itemView); iv_figure = (ImageView) itemView.findViewById(R.id.iv_figure); } public void setData(int position) { WomenBean.WomenData.ModuleBean.DataBean dapeiBean = dapeiqs6data.get(position); //使用Glide加载图片 Glide.with(mContext) .load(dapeiBean.getImg()) .into(iv_figure); } }}
到此,一个基本的商城首页就完成了,其实大家看了思路和代码后大概也都明白了,它并不难,只是比较花时间,需要对每种类型都进行相应的操作。所以现在你也可以没事来整个商城页面玩玩了~
感兴趣的朋友可以看看我的源代码:(已上传至我的资源:商城首页.rar)
(ps:但是因为是从项目中抽出来的,所以可能会有些许凌乱,还望大家见谅~)
5 0
- 高仿各大商城首页---使用分类型的RecyclerView来实现
- 高仿各大商城首页---使用分类型的RecyclerView来实现
- 用RecyclerView+CardView实现 商城首页
- jQuery实现商城首页幻灯片的效果
- BootStrap实现商城首页
- 使用ItemDecoration自定义RecyclerView的分割线实现头布局
- 商城项目实战 | 5.1 RecyclerView 和 CardView 更配 实现首页商品分类
- RecyclerView加载多类型item 实现淘宝首页布局
- ListView和RecyclerView的分类型
- DIV+CSS实现商城首页
- 使用redis对商城的首页添加缓存
- 商城首页的展示方法
- 实现 Recyclerview 的分割线 RecyclerDecoration
- android新特性:商城首页一键回到顶部功能实现(包括ListView, RecyclerView 和 ScrollView)
- 使用MVP来实现recyclerview数据
- RecyclerView(实现分割线)
- RecyclerView的使用,简单实现ListView、GridView效果,添加Item的分割线
- React Native商城项目实战14 - 首页中间下部分
- 【Android】Android从入门到精通(一)——目录
- 单点登陆系统(SSO系统)
- Android 设计模式之备忘录模式
- C++ map
- eclipse不能debug的解决方法,提示Failed to execute MI command: maintenance set python print-stack off
- 高仿各大商城首页---使用分类型的RecyclerView来实现
- Android获得标题栏,状态栏,控件,屏幕高度
- arch无线网络配置 BCM43142无线网卡
- 【数学建模】物资调度的线性约束条件优化模型
- 相机标定原理
- ural 1671
- C语言定时器
- bzoj2141【分块+树状数组】
- java swing 更新JPanel