当前位置:   article > 正文

Android Studio App开发实战项目之实现淘宝电商App首页界面(附源码,可用于大作业参考)_android 淘宝代码

android 淘宝代码

需要源码和图片集请点赞关注收藏后评论区留言或者私信~~~

各家电商的App首页都是动感十足,页面元素丰富令人眼花缭乱,其中运用了Android的多种组合控件,可以说是App界面开发的集大成之作,下面我们也动手实现一个。

一、需求描述

本次项目主要模仿淘宝App采用的技术,所以有底部标签栏,顶部也有标题栏,并且对于分类页面的商品列表,也会有高低不一呈现的瀑布流效果

二、界面设计

界面主要用到了以下控件

1:底部标签栏

2:广告条

3:循环视图RecyclerView

4:工具栏Toolbar

5:标签布局TabLaout

6:第二代翻页视图

7:循环视图的瀑布流布局

8:下拉刷新布局

三、关键部分

1:在ScrollView内部添加RecyclerView

2:关于ViewPager+Fragment的多重嵌套

3:电商首页项目的源码之间关系

与本次项目主要有关的代码之间关系如下

1:DepartmentStoreActivity.java 这是电商App首页的入口代码

2:DepartmentPagerAdapter.java  这是电商首页集成3个碎片页的翻页适配代码

3:DepartmentHomeFragment.java 这是首页标签对应的碎片代码

4:DepartmentClassFragment.java 这是分类标签对应的碎片代码

5:DepartmentCartFragment.java 这是购物车标签对应的碎片代码

四、演示效果 

首页效果如下

 点击下方的标签栏可切换

点击上方的标签栏可以切换到时装频道

 

购物车频道可以参见我之前的博客

 

五、代码 

主类代码

  1. package com.example.chapter12;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.viewpager.widget.ViewPager;
  4. import android.os.Bundle;
  5. import android.widget.RadioButton;
  6. import android.widget.RadioGroup;
  7. import com.example.chapter12.adapter.DepartmentPagerAdapter;
  8. public class DepartmentStoreActivity extends AppCompatActivity {
  9. private ViewPager vp_content; // 声明一个翻页视图对象
  10. private RadioGroup rg_tabbar; // 声明一个单选组对象
  11. @Override
  12. protected void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);
  14. setContentView(R.layout.activity_department_store);
  15. vp_content = findViewById(R.id.vp_content);
  16. // 构建一个翻页适配器
  17. DepartmentPagerAdapter adapter = new DepartmentPagerAdapter(getSupportFragmentManager());
  18. vp_content.setAdapter(adapter); // 设置翻页视图的适配器
  19. // 给翻页视图添加页面变更监听器
  20. vp_content.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
  21. @Override
  22. public void onPageSelected(int position) {
  23. // 选中指定位置的单选按钮
  24. rg_tabbar.check(rg_tabbar.getChildAt(position).getId());
  25. }
  26. });
  27. rg_tabbar = findViewById(R.id.rg_tabbar);
  28. // 设置单选组的选中监听器
  29. rg_tabbar.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  30. @Override
  31. public void onCheckedChanged(RadioGroup group, int checkedId) {
  32. for (int pos=0; pos<rg_tabbar.getChildCount(); pos++) {
  33. // 获得指定位置的单选按钮
  34. RadioButton tab = (RadioButton) rg_tabbar.getChildAt(pos);
  35. if (tab.getId() == checkedId) { // 正是当前选中的按钮
  36. vp_content.setCurrentItem(pos); // 设置翻页视图显示第几页
  37. }
  38. }
  39. }
  40. });
  41. }
  42. }

适配器类代码

  1. package com.example.chapter12.adapter;
  2. import androidx.fragment.app.Fragment;
  3. import androidx.fragment.app.FragmentManager;
  4. import androidx.fragment.app.FragmentPagerAdapter;
  5. import com.example.chapter12.fragment.DepartmentHomeFragment;
  6. import com.example.chapter12.fragment.DepartmentClassFragment;
  7. import com.example.chapter12.fragment.DepartmentCartFragment;
  8. public class DepartmentPagerAdapter extends FragmentPagerAdapter {
  9. // 碎片页适配器的构造方法,传入碎片管理器
  10. public DepartmentPagerAdapter(FragmentManager fm) {
  11. super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT);
  12. }
  13. // 获取指定位置的碎片Fragment
  14. public Fragment getItem(int position) {
  15. if (position == 0) {
  16. return new DepartmentHomeFragment();
  17. } else if (position == 1) {
  18. return new DepartmentClassFragment();
  19. } else if (position == 2) {
  20. return new DepartmentCartFragment();
  21. } else {
  22. return null;
  23. }
  24. }
  25. // 获取碎片Fragment的个数
  26. public int getCount() {
  27. return 3;
  28. }
  29. }

碎片类代码

  1. package com.example.chapter12.fragment;
  2. import android.os.Bundle;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import androidx.appcompat.widget.Toolbar;
  8. import androidx.fragment.app.Fragment;
  9. import com.example.chapter12.R;
  10. public class DepartmentCartFragment extends Fragment {
  11. protected View mView; // 声明一个视图对象
  12. protected AppCompatActivity mActivity; // 声明一个活动对象
  13. @Override
  14. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  15. mActivity = (AppCompatActivity) getActivity();
  16. mView = inflater.inflate(R.layout.fragment_department_cart, container, false);
  17. // 从布局文件中获取名叫tl_head的工具栏
  18. Toolbar tl_head = mView.findViewById(R.id.tl_head);
  19. tl_head.setTitle("购物车"); // 设置工具栏的标题文字
  20. mActivity.setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar
  21. return mView;
  22. }
  23. }

2

  1. package com.example.chapter12.fragment;
  2. import android.os.Bundle;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import androidx.appcompat.app.AppCompatActivity;
  7. import androidx.appcompat.widget.Toolbar;
  8. import androidx.fragment.app.Fragment;
  9. import androidx.viewpager2.widget.ViewPager2;
  10. import com.example.chapter12.R;
  11. import com.example.chapter12.adapter.ClassPagerAdapter;
  12. import com.google.android.material.tabs.TabLayout;
  13. import com.google.android.material.tabs.TabLayoutMediator;
  14. import java.util.ArrayList;
  15. import java.util.List;
  16. public class DepartmentClassFragment extends Fragment {
  17. protected View mView; // 声明一个视图对象
  18. protected AppCompatActivity mActivity; // 声明一个活动对象
  19. private List<String> mTitleList = new ArrayList<String>(); // 标题文字列表
  20. @Override
  21. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  22. mActivity = (AppCompatActivity) getActivity();
  23. mView = inflater.inflate(R.layout.fragment_department_class, container, false);
  24. // 从布局文件中获取名叫tl_head的工具栏
  25. Toolbar tl_head = mView.findViewById(R.id.tl_head);
  26. mActivity.setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar
  27. mTitleList.add("服装");
  28. mTitleList.add("电器");
  29. // 从布局文件中获取名叫tab_title的标签布局
  30. TabLayout tab_title = mView.findViewById(R.id.tab_title);
  31. // 从布局文件中获取名叫vp2_content的二代翻页视图
  32. ViewPager2 vp2_content = mView.findViewById(R.id.vp2_content);
  33. // 构建一个分类信息的翻页适配器。注意Fragment嵌套时要传getChildFragmentManager
  34. ClassPagerAdapter adapter = new ClassPagerAdapter(mActivity, mTitleList);
  35. vp2_content.setAdapter(adapter); // 设置二代翻页视图的适配器
  36. // 把标签布局跟翻页视图通过指定策略连为一体,二者在页面切换时一起联动
  37. new TabLayoutMediator(tab_title, vp2_content, new TabLayoutMediator.TabConfigurationStrategy() {
  38. @Override
  39. public void onConfigureTab(TabLayout.Tab tab, int position) {
  40. tab.setText(mTitleList.get(position)); // 设置每页的标签文字
  41. }
  42. }).attach();
  43. return mView;
  44. }
  45. }

3

  1. package com.example.chapter12.fragment;
  2. import android.os.Bundle;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.LinearLayout;
  7. import android.widget.Toast;
  8. import androidx.appcompat.app.AppCompatActivity;
  9. import androidx.appcompat.widget.Toolbar;
  10. import androidx.fragment.app.Fragment;
  11. import androidx.recyclerview.widget.DefaultItemAnimator;
  12. import androidx.recyclerview.widget.GridLayoutManager;
  13. import androidx.recyclerview.widget.RecyclerView;
  14. import com.example.chapter12.R;
  15. import com.example.chapter12.adapter.MobileGridAdapter;
  16. import com.example.chapter12.adapter.MobileRecyclerAdapter;
  17. import com.example.chapter12.adapter.RecyclerCombineAdapter;
  18. import com.example.chapter12.adapter.RecyclerGridAdapter;
  19. import com.example.chapter12.bean.GoodsInfo;
  20. import com.example.chapter12.bean.NewsInfo;
  21. import com.example.chapter12.util.Utils;
  22. import com.example.chapter12.widget.BannerPager;
  23. import com.example.chapter12.widget.SpacesDecoration;
  24. import java.util.ArrayList;
  25. import java.util.List;
  26. public class DepartmentHomeFragment extends Fragment implements BannerPager.BannerClickListener {
  27. protected View mView; // 声明一个视图对象
  28. protected AppCompatActivity mActivity; // 声明一个活动对象
  29. private List<Integer> getImageList() {
  30. ArrayList<Integer> imageList = new ArrayList<Integer>();
  31. imageList.add(R.drawable.banner_1);
  32. imageList.add(R.drawable.banner_2);
  33. imageList.add(R.drawable.banner_3);
  34. imageList.add(R.drawable.banner_4);
  35. imageList.add(R.drawable.banner_5);
  36. return imageList;
  37. }
  38. @Override
  39. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  40. mActivity = (AppCompatActivity) getActivity();
  41. mView = inflater.inflate(R.layout.fragment_department_home, container, false);
  42. // 从布局文件中获取名叫tl_head的工具栏
  43. Toolbar tl_head = mView.findViewById(R.id.tl_head);
  44. tl_head.setTitle("商城首页"); // 设置工具栏的标题文字
  45. mActivity.setSupportActionBar(tl_head); // 使用tl_head替换系统自带的ActionBar
  46. initBanner(); // 初始化广告轮播条
  47. initGrid(); // 初始化市场网格列表
  48. initCombine(); // 初始化猜你喜欢的商品展示网格
  49. initPhone(); // 初始化手机网格列表
  50. return mView;
  51. }
  52. private void initBanner() {
  53. // 从布局文件中获取名叫banner_pager的广告轮播条
  54. BannerPager banner = mView.findViewById(R.id.banner_pager);
  55. // 获取广告轮播条的布局参数
  56. LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) banner.getLayoutParams();
  57. params.height = (int) (Utils.getScreenWidth(mActivity) * 250f / 640f);
  58. banner.setLayoutParams(params); // 设置广告轮播条的布局参数
  59. banner.setImage(getImageList()); // 设置广告轮播条的广告图片列表
  60. banner.setOnBannerListener(this); // 设置广告轮播条的广告点击监听器
  61. banner.start(); // 开始轮播广告图片
  62. }
  63. // 一旦点击了广告图,就回调监听器的onBannerClick方法
  64. public void onBannerClick(int position) {
  65. String desc = String.format("您点击了第%d张图片", position + 1);
  66. Toast.makeText(mActivity, desc, Toast.LENGTH_LONG).show();
  67. }
  68. private void initGrid() {
  69. // 从布局文件中获取名叫rv_grid的循环视图
  70. RecyclerView rv_grid = mView.findViewById(R.id.rv_grid);
  71. // 创建一个网格布局管理器
  72. GridLayoutManager manager = new GridLayoutManager(mActivity, 5);
  73. rv_grid.setLayoutManager(manager); // 设置循环视图的布局管理器
  74. // 构建一个市场列表的网格适配器
  75. RecyclerGridAdapter adapter = new RecyclerGridAdapter(mActivity, NewsInfo.getDefaultGrid());
  76. adapter.setOnItemClickListener(adapter); // 设置网格列表的点击监听器
  77. adapter.setOnItemLongClickListener(adapter); // 设置网格列表的长按监听器
  78. rv_grid.setAdapter(adapter); // 设置循环视图的网格适配器
  79. rv_grid.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  80. rv_grid.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  81. }
  82. private void initCombine() {
  83. // 从布局文件中获取名叫rv_combine的循环视图
  84. RecyclerView rv_combine = mView.findViewById(R.id.rv_combine);
  85. // 创建一个四列的网格布局管理器
  86. GridLayoutManager manager = new GridLayoutManager(mActivity, 4);
  87. // 设置网格布局管理器的占位规则
  88. // 以下占位规则的意思是:第一项和第二项占两列,其它项占一列;
  89. // 如果网格的列数为四,那么第一项和第二项平分第一行,第二行开始每行有四项。
  90. manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
  91. @Override
  92. public int getSpanSize(int position) {
  93. if (position == 0 || position == 1) { // 为第一项或者第二项
  94. return 2; // 占据两列
  95. } else { // 为其它项
  96. return 1; // 占据一列
  97. }
  98. }
  99. });
  100. rv_combine.setLayoutManager(manager); // 设置循环视图的布局管理器
  101. // 构建一个猜你喜欢的网格适配器
  102. RecyclerCombineAdapter adapter = new RecyclerCombineAdapter(mActivity, NewsInfo.getDefaultCombine());
  103. adapter.setOnItemClickListener(adapter); // 设置网格列表的点击监听器
  104. adapter.setOnItemLongClickListener(adapter); // 设置网格列表的长按监听器
  105. rv_combine.setAdapter(adapter); // 设置循环视图的网格适配器
  106. rv_combine.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  107. rv_combine.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  108. }
  109. private void initPhone() {
  110. // 从布局文件中获取名叫rv_phone的循环视图
  111. RecyclerView rv_phone = mView.findViewById(R.id.rv_phone);
  112. // 创建一个网格布局管理器
  113. GridLayoutManager manager = new GridLayoutManager(mActivity, 3);
  114. rv_phone.setLayoutManager(manager); // 设置循环视图的布局管理器
  115. // 构建一个手机列表的循环适配器
  116. MobileGridAdapter adapter = new MobileGridAdapter(mActivity, GoodsInfo.getDefaultList());
  117. rv_phone.setAdapter(adapter); // 设置循环视图的网格适配器
  118. adapter.setOnItemClickListener(adapter); // 设置网格列表的点击监听器
  119. adapter.setOnItemLongClickListener(adapter); // 设置网格列表的长按监听器
  120. rv_phone.setItemAnimator(new DefaultItemAnimator()); // 设置循环视图的动画效果
  121. rv_phone.addItemDecoration(new SpacesDecoration(1)); // 设置循环视图的空白装饰
  122. }
  123. }

XML文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <androidx.viewpager.widget.ViewPager
  6. android:id="@+id/vp_content"
  7. android:layout_width="match_parent"
  8. android:layout_height="0dp"
  9. android:layout_weight="1" />
  10. <RadioGroup
  11. android:id="@+id/rg_tabbar"
  12. android:layout_width="match_parent"
  13. android:layout_height="60dp"
  14. android:orientation="horizontal">
  15. <RadioButton
  16. android:id="@+id/rb_home"
  17. style="@style/TabButton"
  18. android:checked="true"
  19. android:text="首页"
  20. android:drawableTop="@drawable/tab_first_selector" />
  21. <RadioButton
  22. android:id="@+id/rb_class"
  23. style="@style/TabButton"
  24. android:text="分类"
  25. android:drawableTop="@drawable/tab_second_selector" />
  26. <RadioButton
  27. android:id="@+id/rb_cart"
  28. style="@style/TabButton"
  29. android:text="购物车"
  30. android:drawableTop="@drawable/tab_third_selector" />
  31. </RadioGroup>
  32. </LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/31509
推荐阅读
相关标签
  

闽ICP备14008679号