摘要:本文分享一款面向农业领域的 Android 综合服务平台——智慧农业 App 的设计与实现。项目以"农产品商城 + 农业社区交流"为核心,覆盖用户注册登录、农资商品浏览与购买、购物车结算、订单管理、社区发帖互动、点赞评论、管理员商品发布与订单监管、个性主题换肤等完整业务。技术栈采用 Android 原生 + SQLite 本地库 + OkHttp 网络层双模式、Glide 图片加载、PictureSelector 图片选择、skin-support 动态换肤,适合作为毕设或课程设计的完整参考案例。
一、项目概述
1.1 项目背景
随着移动互联网向三农领域下沉,农户对农资采购、种植技术交流的需求越来越强烈。传统的农资购买渠道分散、价格不透明,而种植经验又大多停留在口头传播。本项目以智慧农业为切入点,构建一个"在线农资商城 + 农业社区互动"一体化的移动平台,让农户能够一站式选购化肥、种子等农资,同时在社区中学习科学种植、分享农事经验。
1.2 功能矩阵
| 用户体系 | 注册 / 登录 / 记住密码 / 自动登录 / 修改密码 | 预置账号 admin/123 |
| 农资商城 | 首页轮播 + 搜索 + 商品列表 + 详情 + 加购/立即购买 | 发布商品 / 删除商品 |
| 购物车 | 多选 / 合计 / 结算 | — |
| 订单 | 我的订单 | 查看全部订单 |
| 农业社区 | 帖子列表 / 发布图文 / 点赞 / 评论 | 同左 |
| 个人中心 | 个人信息 / 我的订单 / 个性主题 / 关于 / 退出登录 | 同左 |
1.3 应用截图
图 1 — 登录页(清新绿色农业风 Logo)

登录页采用白绿配色,顶部为嫩芽 Logo,中部为用户名/密码输入区,底部提供"记住密码"与注册入口,登录按钮采用圆角主色填充,视觉上贴合农业主题。
图 2 — 注册页(头像选择 + 性别单选)

注册页支持通过 PictureSelector 选择头像,采集用户名、性别、手机号、地址、密码、确认密码等字段,并做基础非空与一致性校验。
图 3 — 普通用户首页(轮播 + 搜索 + 农资商品列表)

_20260524_124203.png&pos_id=img-aFGV4BSy-1787749675044)
首页由顶部搜索栏、中部 ViewPager 自动轮播横幅、底部 ListView 商品列表组成。商品覆盖化肥、菜籽种子等农资品类,展示图片、名称、简介、价格、分类与库存。
图 4 — 商品详情页(加入购物车 / 立即购买)

详情页展示商品大图、完整描述、价格与分类,底部提供"加入购物车"和"立即购买"两个主操作。普通用户看到购买入口,管理员进入同一页面则显示删除按钮。
图 5 — 农业社区列表页

社区页以卡片形式展示农业种植相关帖子,包含封面图、标题、摘要与发布时间,右下角浮动"发布"按钮,方便用户随时分享种植经验。
图 6 — 社区详情页(点赞 + 评论)

详情页展示帖子完整内容与配图,支持点赞切换与评论输入,评论列表按时间展示用户头像、昵称、日期与评论内容,长按可删除评论。
图 7 — 购物车列表(多选 + 合计 + 结算)

购物车支持条目勾选,底部实时计算已选项总价,点击"结算"将所选商品批量生成订单记录。
图 8 — 我的订单记录

订单记录展示当前用户历史下单信息,包括商品图片、名称、价格与收货地址,便于用户追溯。

二、技术栈与依赖
2.1 基础配置
| Application ID | com.example.smartAgriculture |
| compileSdkVersion | 30 |
| targetSdkVersion | 28 |
| minSdkVersion | 21(Android 5.0+) |
| Java 文件数 | 60 个 |
| 主色 | 薄荷绿 #09C6A0 |
2.2 核心依赖
// build.gradle 核心依赖
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
// 图片加载与选择
implementation 'com.github.bumptech.glide:glide:4.11.0'
implementation 'jp.wasabeef:glide-transformations:3.3.0'
implementation 'com.github.LuckSiege.PictureSelector:picture_library:v2.6.0'
// 网络与序列化
implementation 'com.squareup.okhttp3:okhttp:4.4.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'io.reactivex.rxjava2:rxjava:2.2.9'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
// 主题换肤
implementation 'skin.support:skin-support:4.0.5'
implementation 'skin.support:skin-support-appcompat:4.0.5'
implementation 'skin.support:skin-support-design:4.0.5'
// 历史兼容
implementation files('libs\\\\volley.jar')
设计说明:项目保留了 OkHttp 网络层实现,同时支持离线 SQLite 模式。通过登录页的"自动登录"开关(对应 MyApplication.offlineLogin)可在本地登录与网络登录之间切换:勾选自动登录时直接走 SQLite 校验;取消勾选则通过 OkHttp 向后端接口发起账号校验。这种"双模式"设计既保证了 demo 可离线运行,也为后续接入服务端预留了扩展能力。
三、架构设计
3.1 整体架构
项目采用经典的 Activity + Fragment + DAO 三层结构,未引入 MVP/MVVM,保持代码直观、易于阅读,非常适合学习与二次开发:
UI 层: Activity(15 个)/ Fragment(7 个)/ Adapter(7 个)
│
业务层: Okhttp 网络层 + DBHelper / DBUser / DBStuff / DBRecord /
│ DBCart / DBCommunity / DBCommunityComment(7 个 DAO)
│
数据层: entity(本地实体)+ bean(网络响应)+ utils(工具类)
3.2 包结构
com.example.order/
├── MyApplication.java 自定义 Application(初始化 skin-support)
├── activity/ 15 个 Activity
│ ├── BaseActivity.java Activity 基类(换肤)
│ ├── OpenActivity.java 启动/欢迎页
│ ├── LoginActivity.java 登录(区分本地/网络模式与角色)
│ ├── RegisterActivity.java 注册(上传头像)
│ ├── MainActivity.java 普通用户主页
│ ├── AdminMainActivity.java 管理员主页
│ ├── DetailActivity.java 商品详情 / 购买 / 删除
│ ├── ShoppingCartActivity.java 购物车结算
│ ├── PublishProductActivity.java 发布/上架商品(管理员)
│ ├── MyInfoActivity.java 个人信息编辑
│ ├── MyRecordActivity.java 我的订单记录
│ ├── AddCommunityActivity.java 发布社区图文
│ ├── CommunityDetailActivity.java 社区详情 + 点赞 + 评论
│ ├── AboutActivity.java 关于
│ ├── PasswordActivity.java 重置密码
│ └── ThemeActivity.java 主题换肤设置
├── fragment/ 7 个 Fragment
│ ├── BaseFragment.java
│ ├── UserShopFragment.java 普通用户-商城页
│ ├── CommunityFragment.java 社区列表页
│ ├── BlankFragment_me.java 普通用户-我的页
│ ├── BlankFragment_Cart.java 普通用户-购物车页
│ ├── FragmentMainAdmin.java 管理员-商城管理页
│ ├── FragmentCartAdmin.java 管理员-全部订单页
│ └── FragmentMeAdmin.java 管理员-我的页
├── adapter/ 7 个 Adapter
│ ├── AdPagerAdapter 轮播图
│ ├── StuffAdapter 商品列表
│ ├── CommunityAdapter 社区帖子列表
│ ├── CartAdapter 购物车
│ ├── RecordAdapter 我的订单
│ ├── AdminAllRecordAdapter 全部订单
│ └── CommentListAdapter 评论列表
├── bean/ 网络响应实体
├── entity/ 本地实体
├── database/ 7 个 DAO
└── utils/ 工具类
3.3 多角色路由
应用在 DBHelper.init() 中预置管理员账号,登录成功后通过 DBUser.isAdmin() 决定进入普通用户主页还是管理员主页:
// DBHelper.java
public void init(){
DBUser user = new DBUser(context);
if (!user.checkUser("admin")) {
User user1 = new User("admin", "123", "广东省广州市", "男",
"17620885471", "管理员", UserTypeEnum.Admin.getDesc());
user.add(user1);
}
DBUser.user = user.get(SPUtils.getName(context));
// …
}
// LoginActivity.java
private void start() {
if (DBUser.isAdmin()) {
startActivity(new Intent(LoginActivity.this, AdminMainActivity.class));
} else {
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
finish();
}
注意:AndroidManifest.xml 中声明的 package="com.example.smallshop" 与业务代码主包 com.example.order 不一致,R 类引用也使用 com.example.smallshop.R。这是历史遗留问题,不影响运行,但生产环境建议统一包名。
四、数据库设计
数据库名:smartAgricultureApp.db,版本 1,存放于外部存储根目录,便于调试查看。
4.1 建表 SQL
// DBHelper.onCreate()
// 用户表
String sql = "create table user(id integer primary key autoincrement," +
"name text not null,password text not null,address text not null," +
"sex text not null,phone text not null,photo text not null," +
"user_type text not null)";
sqLiteDatabase.execSQL(sql);
// 购物车表
sql = "create table cart(id text not null,username text not null,PRIMARY KEY(id,username))";
sqLiteDatabase.execSQL(sql);
// 订单表
sql = "create table Record(username text not null,id text not null," +
"name text not null,price text not null,address text not null)";
sqLiteDatabase.execSQL(sql);
// 商品表(含库存)
sql = "CREATE TABLE Stuff (id integer primary key autoincrement, " +
"name text not null, title text not null, kind text not null, " +
"price text not null, path text not null, inventory integer)";
sqLiteDatabase.execSQL(sql);
// 社区帖子表
sql = "CREATE TABLE community (id integer primary key autoincrement, " +
"user_id integer, title text not null, photo text not null, " +
"content text not null, date text not null, likes INTEGER)";
sqLiteDatabase.execSQL(sql);
// 社区评论表
sql = "CREATE TABLE communityComments (id integer primary key autoincrement, " +
"user_id integer, community_id INTEGER, name text not null, " +
"comment_text text not null, comment_date text not null)";
sqLiteDatabase.execSQL(sql);
4.2 表结构说明
| user | name, password, address, sex, phone, photo, user_type | 用户基本信息与角色 |
| cart | id, username | 联合主键,避免同一用户重复加购 |
| Record | username, id, name, price, address | 订单快照,记录下单时商品与地址 |
| Stuff | name, title, kind, price, path, inventory | 农资商品,新增库存字段 |
| community | user_id, title, photo, content, date, likes | 社区帖子,支持点赞数 |
| communityComments | user_id, community_id, name, comment_text, comment_date | 帖子评论 |
4.3 预置数据
首次启动时 DBHelper.init() 写入以下数据:
- 用户:admin/123(管理员)、小李/123、小王/123(普通用户)。
- 商品:化肥类(硝酸铵钙 ¥138、大量元素水溶肥料 ¥166、腐植酸复合肥 ¥155、中量元素水溶肥 ¥169);菜籽种子类(华油杂 62 ¥49、沣油 737 ¥55、浙油 50 ¥59)。
- 社区帖子:4 篇农业主题帖子,涵盖种地初心、科学施肥、农事预防、深耕乡土,并预置评论。
五、关键模块实现
5.1 首页:轮播 + 搜索 + 列表
UserShopFragment 使用 Handler + Runnable 实现 3 秒自动轮播,并在用户触摸时暂停、松开后恢复:
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
int currentItem = mViewPager.getCurrentItem();
int itemCount = mViewPager.getAdapter().getCount();
int nextItem = (currentItem + 1) % itemCount;
mViewPager.setCurrentItem(nextItem);
mHandler.postDelayed(this, 3000);
}
};
搜索逻辑遍历商品名称与详情,命中即刷新列表;未命中则提示并回退原始列表。列表点击后通过 Intent 传递商品 ID 到 DetailActivity。
5.3 社区互动:点赞 + 评论
CommunityDetailActivity 接收帖子实体后展示详情,点击爱心图标切换点赞状态并更新数据库:
like.setOnClickListener(v -> {
if (bean.getLike() == 0) {
like.setImageResource(R.drawable.like);
bean.setLike(1);
} else {
like.setImageResource(R.drawable.unlike);
bean.setLike(0);
}
DBHelper.GetInstance(this).getDBCommunity().change(bean);
});
评论通过 DBCommunityComment 写入,并按 community_id 过滤展示,支持长按删除。
5.4 主题换肤
项目引入 skin-support 框架,所有 Activity 继承 BaseActivity,在 onCreate() 中根据 SPUtils 保存的主题类型动态设置颜色:
// BaseActivity.java
protected void setTheme() {
int type = SPUtils.getTheme(this);
if (type == 0) {
setTheme(R.style.AppTheme);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#09C6A0")
.setColorActivated("#09C6A0").build());
} else if (type == 1) {
setTheme(R.style.AppTheme1);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#000000")
.setColorActivated("#000000").build());
} else if (type == 2) {
setTheme(R.style.AppTheme3);
SkinCompatUserThemeManager.get().addColorState(R.color.colorPrimary,
new ColorState.ColorBuilder()
.setColorDefault("#6633FF")
.setColorActivated("#6633FF").build());
}
}
@Override
public AppCompatDelegate getDelegate() {
return SkinAppCompatDelegateImpl.get(this, this);
}
MyApplication 在启动时初始化 SkinCompatManager,并添加 AppCompat 与 Material Design 控件换肤支持。
六、业务流程串讲
6.1 普通用户下单流程
UserShopFragment / DetailActivity
├─ 加入购物车:DBCart.add(id, username) → ShoppingCartActivity
└─ 立即购买:DBRecord.add(快照) → MyRecordActivity
ShoppingCartActivity(多选 → 结算)
└─ 遍历勾选项:DBRecord.add(快照) × N
DBCart.delete(id, username) × N
6.2 社区互动流程
CommunityFragment
→ 点击帖子 → CommunityDetailActivity
→ 点赞:更新 community.likes
→ 评论:写入 communityComments
→ 长按评论:删除评论
→ 点击发布 → AddCommunityActivity
→ 填写标题/内容/选择图片 → DBCommunity.add()
6.3 管理员商品管理流程
AdminMainActivity
→ FragmentMainAdmin(商城页)
→ 浮动 "+" 按钮 → PublishProductActivity
→ 填写名称/详情/分类/价格/库存 → DBStuff.add()
→ 点击商品 → DetailActivity
→ 删除 → DBStuff.delete()
→ FragmentCartAdmin(所有订单)
→ 查看全部用户订单
七、权限与清单
| WRITE_EXTERNAL_STORAGE | 数据库存放于外部存储、图片选择保存 |
| READ_EXTERNAL_STORAGE | 相册选图 |
| INTERNET | OkHttp 网络请求 |
| CAMERA | 拍照上传头像/帖子图片 |
| CALL_PHONE | 预留电话联系 |
清单中声明 15 个 Activity,OpenActivity 为 LAUNCHER,并使用自定义 MyApplication 初始化换肤框架。
八、可优化方向
九、写在最后
智慧农业 App 以农业电商与社区交流为业务载体,完整覆盖了 Android 应用开发中的用户体系、角色路由、列表/详情、购物车/订单、SQLite 持久化、图片加载与选择、ViewPager 轮播、社区互动、动态换肤等核心技能点。项目采用"SQLite + OkHttp 双模式"设计,既能在无后端环境下独立演示,也方便后续平滑接入服务端,是一款适合毕设、课程设计或 Android 进阶练手的完整模板。
后续可在此基础上继续扩展农技问答、农资行情、定位推荐、天气对接等模块,进一步贴近真实农业服务场景。





![[Android] 即存 -10+平台视频下载-171主机测评](https://www.171host.com/wp-content/uploads/2026/10/20261029031849-6ae2bb19c8977-220x150.jpg)