Android移动应用开发
课程设计报告
(2019—2020学年 第Ⅰ学期)
商品管理系统
系 别 信息与控制工程系
专 业 计算机科学与技术
班 级 计算机1702
学 号 173230221
姓 名 孟繁武
指导教师 郭丹
完成时间 2019年12月05日
目 录
商品管理系统1
一、需求分析1
二、系统设计1
1、数据流图 1
2、功能描述 1
3、系统开发及运行环境 2
三、系统测试2
1、登录界面 2
2、注册界面 3
3、主界面 5
4、商品展示界面 6
5、管理商品界面 7
6、留言板界面 8
四、 系统实现9
(核心模块界面,关键代码) 9
1、管理商品9
activity_guanli.xml 9
布局文件listview_item.xml 12
CartBean实体类 13
CartAdapter适配器类 14
MyHelper数据库类 15
2、商品展示19
activity_shangpin.xml 19
布局文件list_item.xml 19
五、个人心得22
一、需求分析
购物已成为生活中不可缺少的一部分,大大小小的商店,超市充斥着城市乡镇的每个角落,一套优秀的商品管理系统对于商家的管理者和消费者都会起到很重要的作用,不但便于消费者对商品信息进行查询,也便于商家对所拥有的产品信息进行添加,修改,查询,删除等操作,因此有必要设计一套管理系统对商品进行管理。
二、系统设计
1、数据流图
2、功能描述
2.1登录功能
需要输入账号、密码才能进入主页面。因时间等因素,本次app设计比较简单,只要账号密码都不为空就能登陆成功进入下一界面。这里用到了activity之间的跳转和数据传递功能将账号传递到主页面并将其显示出来。用Toast语句提示登陆成功或登录失败。
2.2注册功能
输入账号密码以及再次输入密码即可(这里密码与再次输入的密码必须一致),因本app只是个人用途所以这部分功能并没有全部实现。
2.3主界面功能
这里用数据传递获取登录界面传递过来的账号信息,并显示在界面上方便用户查看,界面主要放了三个按钮用于点击跳转到其他功能界面。
2.4商品展示功能
本界面功能用listview展示部分商品,包括图片,商品名字,价格,评价等信息,方便用户查看。
2.5管理商品功能
用安卓自带的SQLite进行商品名称、数量、价格等数据的增加、删除、修改、查询等功能,用listview加以展示出来。方便用户管理商品信息。
2.6留言板功能
主要用于存放用户对app的意见,用文件数据存储方式进行储存。
3、系统开发及运行环境
开发环境:android studio
运行环境:Android智能手机(平时自己用的vivo nexs)
三、系统测试
1、登录界面
2、注册界面
3、主界面
4、商品展示界面
5、管理商品界面
6、留言板界面
四、系统实现
(核心模块界面,关键代码)
1、管理商品
activity_guanli.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorGrayDark"
android:orientation="vertical"
tools:context="com.example.deal1.GuanliActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="25dp"
android:text="管理商品"
android:textSize="45sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="商品:"
android:textSize="25sp" />
<EditText
android:id="@ id/et_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:hint="请输入商品名称"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="数量:"
android:textSize="25sp" />
<EditText
android:id="@ id/et_number"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:hint="请输入购买数量"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="0dp"
android:layout_height="35dp"
android:layout_weight="1"
android:gravity="center"
android:text="价格:"
android:textSize="25sp" />
<EditText
android:id="@ id/et_price"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="3"
android:hint="请输入商品价格"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:orientation="horizontal">
<Button
android:id="@ id/add"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="#b9b9ff"
android:text="添加"
android:textSize="18sp" />
<View
android:layout_width="5dp"
android:layout_height="45dp"
android:background="@android:color/white" />
<Button
android:id="@ id/query"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="#dcb5ff"
android:text="查询"
android:textSize="18sp" />
<View
android:layout_width="5dp"
android:layout_height="45dp"
android:background="@android:color/white" />
<Button
android:id="@ id/update"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="#acd6ff"
android:text="修改"
android:textSize="18sp" />
<View
android:layout_width="5dp"
android:layout_height="45dp"
android:background="@android:color/white" />
<Button
android:id="@ id/delete"
android:layout_width="0dp"
android:layout_height="45dp"
android:layout_weight="1"
android:background="#acd6ff"
android:text="删除"
android:textSize="18sp" />
</LinearLayout>
<ListView
android:id="@ id/listView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:background="#00FFFFFF" />
</LinearLayout>
布局文件listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@drawable/wupin"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:orientation="vertical">
<TextView
android:id="@ id/tv_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"/>
<TextView
android:id="@ id/tv_price"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:textSize="20sp"/>
<TextView
android:id="@ id/tv_number"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>
CartBean实体类
package com.example.deal1;
class CartBean {
private String name;
private String price;
private String number;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
CartAdapter适配器类
package com.example.deal1;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.List;
class CartAdapter extends BaseAdapter {
private List<CartBean> list;
private LayoutInflater layoutInflater;
public CartAdapter(Context context, List<CartBean> list){
this.layoutInflater = LayoutInflater.from(context);
this.list = list;
}
@Override
public int getCount() {
Log.e("yanwenhua","list.size()--" list.size());
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView==null){
convertView=layoutInflater.inflate(R.layout.listview_item,null);
viewHolder=new ViewHolder(convertView);
convertView.setTag(viewHolder);
}else {
viewHolder=(ViewHolder) convertView.getTag();
}
CartBean cartBean = list.get(position);
viewHolder.tv_name.setText("商品名称:" cartBean.getName());
viewHolder.tv_price.setText("商品价格:" cartBean.getPrice());
viewHolder.tv_number.setText("商品数量:" cartBean.getNumber());
Log.e("yanwenhua","cartBean.getName()-" cartBean.getName() " " cartBean.getPrice() " " cartBean.getNumber());
return convertView;
}
class ViewHolder{
TextView tv_name;
TextView tv_price;
TextView tv_number;
public ViewHolder(View view){
tv_name = (TextView) view.findViewById(R.id.tv_name);
tv_price = (TextView) view.findViewById(R.id.tv_price);
tv_number = (TextView) view.findViewById(R.id.tv_number);
}
}
}
MyHelper数据库类
package com.example.deal1;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context) {
super(context, "shoppingcart.db", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE cart(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20), price VARCHAR(20), number VARCHAR(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
GuanliActivity.java
package com.example.deal1;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class GuanliActivity extends AppCompatActivity implements View.OnClickListener {
private EditText et_name, et_price, et_number;
private ListView listView;
private String name, price, number;
private MyHelper myHelper;
private SQLiteDatabase db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guanli);
et_name = (EditText) findViewById(R.id.et_name);
et_price = (EditText) findViewById(R.id.et_price);
et_number = (EditText) findViewById(R.id.et_number);
listView = (ListView) findViewById(R.id.listView);
Button add = (Button) findViewById(R.id.add);
Button query = (Button) findViewById(R.id.query);
Button update = (Button) findViewById(R.id.update);
Button delete = (Button) findViewById(R.id.delete);
add.setOnClickListener(this);
query.setOnClickListener(this);
update.setOnClickListener(this);
delete.setOnClickListener(this);
myHelper = new MyHelper(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
db = myHelper.getWritableDatabase();
name = et_name.getText().toString();
price = et_price.getText().toString();
number = et_number.getText().toString();
ContentValues values = new ContentValues(); //创建ContentValues对象
values.put("name", name); //将数据添加到ContentValues对象
values.put("price", price);
values.put("number", number);
db.insert("cart", null, values);
db.close();
Toast.makeText(this, "信息已添加", Toast.LENGTH_SHORT).show();
break;
case R.id.query:
Log.e("yanwenhua", "123");
List<CartBean> list = new ArrayList();
db = myHelper.getWritableDatabase();
Cursor cursor = db.query("cart", null, null, null, null,
null, null);
if (cursor.getCount() == 0) {
Toast.makeText(this, "没有数据", Toast.LENGTH_SHORT).show();
} else {
while (cursor.moveToNext()) {
CartBean cartBean = new CartBean();
int nameIndex = cursor.getColumnIndex("name");
int priceIndex = cursor.getColumnIndex("price");
int numberIndex = cursor.getColumnIndex("number");
String name = cursor.getString(nameIndex);
String price = cursor.getString(priceIndex);
String number = cursor.getString(numberIndex);
Log.e("yanwenhua", "cursor.getCount();--" cursor.getCount() "name-" name " " price " " number);
cartBean.setName(name);
cartBean.setPrice(price);
cartBean.setNumber(number);
list.add(cartBean);
}
CartAdapter adapter = new CartAdapter(GuanliActivity.this, list);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
cursor.close();
db.close();
break;
case R.id.update:
name = et_name.getText().toString();
price = et_price.getText().toString();
number = et_number.getText().toString();
db = myHelper.getWritableDatabase();
values = new ContentValues(); // 要修改的数据
values.put("number", number);
values.put("price", price);
db.update("cart", values, "name=?",
new String[]{name}); // 更新并得到行数
db.close();
Toast.makeText(this, "信息已修改", Toast.LENGTH_SHORT).show();
break;
case R.id.delete:
db = myHelper.getWritableDatabase();
db.delete("cart", "name=?", new String[]{et_name.getText().toString()});
Toast.makeText(this, "信息已删除", Toast.LENGTH_LONG).show();
List<CartBean> list2 = new ArrayList();
CartAdapter adapter = new CartAdapter(GuanliActivity.this, list2);
adapter.notifyDataSetChanged();
listView.setAdapter(adapter);
db.close();
break;
}
}
}
2、商品展示
activity_shangpin.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ShangpinActivity">
<TextView
android:id="@ id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="商品展示"
android:textSize="55sp"
android:layout_centerHorizontal="true"/>
<ListView
android:id="@ id/lv"
android:layout_marginTop="15dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@ id/text1"/>
</RelativeLayout>
布局文件list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="15dp">
<ImageView
android:id="@ id/iv"
android:layout_width="150dp"
android:layout_height="150dp"
android:layout_gravity="center"
android:background="@drawable/baijian" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginLeft="15dp"
android:orientation="vertical">
<TextView
android:id="@ id/biaoti"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="充电宝"
android:textSize="25sp" />
<TextView
android:id="@ id/jiage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="15元"
android:textSize="25sp" />
<TextView
android:id="@ id/pingjia"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="电量很足,能使用很久"
android:textSize="25sp" />
</LinearLayout>
</LinearLayout>
ShangpinActivity.java
package com.example.deal1;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class ShangpinActivity extends AppCompatActivity {
private ListView lv;
private String[] biaoti = {"创意摆件", "实用笔记", "道歉礼物", "美观日历", "创意时钟", "玩偶娃娃", "温馨夜灯", "水杯"};
private String[] jiage = {"55元", "15元", "65元", "35元", "100元", "220元", "85元", "99元"};
private String[] pingjia = new String[]{"随处摆放,很美观", "页面平整,写字舒服", "哄女友神器",
"美观,方便看时间", "很有创意感", "毛茸茸很舒服", "灯光柔和,温暖舒心", "保温效果很好"};
private int[] icons = {R.drawable.baijian, R.drawable.biji, R.drawable.liwu, R.drawable.rili,
R.drawable.shizhong, R.drawable.wanou, R.drawable.yedeng, R.drawable.shuibei};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shangpin);
lv = findViewById(R.id.lv);
MyBaseAdapter myBaseAdapter = new MyBaseAdapter();
lv.setAdapter(myBaseAdapter);
}
class MyBaseAdapter extends BaseAdapter {
@Override
public int getCount() {
return biaoti.length;
}
@Override
public Object getItem(int position) {
return biaoti[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(ShangpinActivity.this, R.layout.list_item, null);
TextView biaoti0 = view.findViewById(R.id.biaoti);
TextView jiage0 =view. findViewById(R.id.jiage);
TextView pingjia0 = view.findViewById(R.id.pingjia);
ImageView iv = view.findViewById(R.id.iv);
biaoti0.setText(biaoti[position]);
jiage0.setText(jiage[position]);
pingjia0.setText(pingjia[position]);
iv.setBackgroundResource(icons[position]);
return view;
}
}
}
五、个人心得
这个程序作完不难,关键是调试,修改的过程很难。还有一点,一个细心的人作程序可能少走弯路。一般作程序不是从头到尾作完再调试,这样很难调好,因为每编一句都可能出错,这样错误越积越多,最好的方法是每作完一个小段调试一次,一步一步循序渐进地作完,到最后不至于出了很多错误,不知如何寻找,同样少了很多的麻烦。编程多了,自然地经验多了,调程序就不觉得那么难了。
要想编好、快速完成任务,就必须有严谨的科学态度,比如说一个字母,甚至一个标点符号的错误都会导致错误,这种错误在编程中我们经常出现,有时系统能让你很快找出,你能顺利往下进行,但有时它提示的错误信息和标点一点关系都没有,而后你把编的程序从头到尾看了一遍, 结果花了大量的时间, 大大降低了效率。其它的粗心大意错误更是五花八门,调试起来就更加困难了,所以在编程时一定要心细。编程要有耐心,因为编程是件很繁琐的工作,如果没有耐心恐怕是编不下去的,比如有的人,有好几处错误,就放弃了,结果一事无成。
最后一点,就是编程时思路一定要清楚。因为编程本身就是一个严密的逻辑过程,实现每一步的操作需要那些命令,哪些条件都是清清楚楚,明明了了的,来不得半点遗漏。
总的来说,编程是件复杂的脑力劳动,要有科学严谨的科学态度,细心的习惯和耐心才能作好,要做到以上的要求我们还要做许多许多。
在课程设计的过程中,我遇到了很多问题,通过查阅参考书和老师的指导,都得到了解决。这不仅仅锻炼了我分析问题和解决问题的能力,也使我意识到自己对知识的了解程度远了,知识的缺乏也在很多方面。以后我一定会努力提高自己的理论水平,同时尽可能多地读一些科学书籍,提高自己的理论水平和动手实践能力。由于时间的限制,解决这个问题和本文不能被称为完美。在许多地方还有待阐述,修改和完善