Android——(SQLite数据库)ListView控件之商品展示案例
16lz
2021-01-25
一、实验目的
开发一个购物车,需要将购物车中的商品以列表的形式展示,并且还需要对购物车中的商品进行增删改查操作。要实现这些功能就需要使用 ListView 和 SQLite 数据库。
二、 训练目标
1) 掌握 SQLite 存储方式
2) 掌握如何使用 SQLite 完成 CRUD 操作
三、实验步骤:
1、首先创建程序,设计用户交互界面。此程序对应的布局文件(activity_main.xml)如下所示:
<?xml version="1.0" encoding="utf-8"?>
android:src="@android:drawable/ic_input_add" 显示图片的原图大小
效果图展示:
2.创建ListView
Item布局 在res/layout下创建一个item.xml文件,创建三个TextView和三个ImageView,代码如下:
<?xml version="1.0" encoding="utf-8"?>
添加的三个TextView分别用于显示数据库中的某条数据的id,商品名称,金额。添加的三个ImageView用于增加金额,减少金额,删除数据。
效果图展示:
4.创建Account类
在操作数据库时将数据存放至一个JavaBean对象操作起来比较方便。因此需要在cn.edu.bzu.productshow包下创建一个Bean包用于存放JavaBean类,然后在cn.edu.bzu.productshow.Bean包下定义一个类Account。具体代码如下:
package cn.edu.bzu.productshow.bean;/** * Created by Administrator on 2017/4/17. */public class Account { private Long id; private String name; private Integer balance; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getBalance() { return balance; } public void setBalance(Integer balance) { this.balance = balance; }public Account(Long id,String name,Integer balance){ super(); this.id=id; this.name=name; this.balance=balance;} public Account(String name,Integer balance){ super(); this.name=name; this.balance=balance; } public Account(){ super(); } @Override public String toString() { return "[序号" +id+", 商品名称:"+name+" , 余额:"+balance + "]"; }}
5.创建数据操作逻辑类 在cn.edu.bzu.productshow.Dao包下创建一个AccountDao类用于操作数据。具体代码如下:
package cn.edu.bzu.productshow.dao;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import java.util.ArrayList;import java.util.List;import cn.edu.bzu.productshow.bean.Account;/** * Created by Administrator on 2017/4/17. */public class AccountDao { private MyHelper helper; public AccountDao(Context context){ //创建dao时 创建Helper helper=new MyHelper(context); } public void insert(Account account){ //获取数据库对象 SQLiteDatabase db=helper.getWritableDatabase(); //用来装载要插入的数据的map<列名,列的值> ContentValues values=new ContentValues(); values.put("name",account.getId()); values.put("balance",account.getBalance()); //向account表插入数据values long id=db.insert("account",null,values); account.setId(id);//的到id db.close();//关闭数据库 } //根据id 删除数据 public int delete(long id){ SQLiteDatabase db=helper.getWritableDatabase(); //按条件删除指定表中的数据,返回受影响的行数 int count=db.delete("account","_id=?",new String[]{ id+""}); db.close(); return count; } //更新数据 public int update(Account account) { SQLiteDatabase db=helper.getWritableDatabase(); ContentValues values =new ContentValues();//要修改的数据 values.put("name",account.getName()); values.put("balance",account.getBalance()); int count=db.update("account",values,"_id=?",new String[]{ account.getId()+""});//更新并得到行数 db.close(); return count; } //查询所有数据倒序排列 public List queryAll(){ SQLiteDatabase db=helper.getReadableDatabase(); Cursor c=db.query("account",null,null,null,null,null,"balance DESC"); Listlist=new ArrayList(); while(c.moveToNext()){ //可以根据列名获取索引 long id=c.getLong(c.getColumnIndex("_id")); String name=c.getString(1); int balance=c.getInt(2); list.add(new Account(id,name,balance)); } c.close(); db.close(); return list; }}
上述代码是操作数据库的逻辑类AccountDao。 该类创建了对数据库的增删改查操作的方法。 6.编写页面交互代码 数据库操作完成之后需要界面与数据库交互,用于实现将数据库中的数据以ListView的形式展示在界面上,具体代码如下所示:
package cn.edu.bzu.productshow;import android.app.AlertDialog.Builder;import android.app.Activity;import android.content.DialogInterface;import android.os.Bundle;import android.support.v7.app.AlertDialog;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import java.util.List;import cn.edu.bzu.productshow.bean.Account;import cn.edu.bzu.productshow.dao.AccountDao;import android.widget.AdapterView.OnItemClickListener;public class MainActivity extends Activity { //需要适配的数据集合 private List list; //数据库增删改查操作类 private AccountDao dao; //输入姓名的EditText private EditText nameET; //输入金额的EditText private EditText balanceET; //适配器 private MyAdapter adapter; //ListView private ListView accountLV; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化控件 initView(); dao = new AccountDao(this); //从数据库查询出所有数据 list = dao.queryAll(); adapter = new MyAdapter(); accountLV.setAdapter(adapter);//给ListView添加适配器(自动把数据生成条目) } //初始化控件 private void initView() { accountLV = (ListView) findViewById(R.id.accountLV); nameET = (EditText) findViewById(R.id.nameET); balanceET = (EditText) findViewById(R.id.balanceET); //添加监听器,监听条目点击事件 accountLV.setOnItemClickListener(new MyOnItemClickListener()); } //activity_main_xml对应ImageView的点击事件触发的方法 public void add(View v) { String name = nameET.getText().toString().trim(); String balance = balanceET.getText().toString().trim(); //三木运算balance.equals("")则等于0 //如果balance不是空字符串 则进行类型转换 Account a = new Account(name, balance.equals("") ? 0 : Integer.parseInt(balance)); dao.insert(a); list.add(a); adapter.notifyDataSetChanged();//刷新界面 //选中最后一个 accountLV.setSelection(accountLV.getCount() - 1); nameET.setText(""); balanceET.setText(""); } //自定义一个适配器(把适配器装到ListView的工具) private class MyAdapter extends BaseAdapter { @Override public int getCount() {//获取条目总数 return list.size(); } @Override public Object getItem(int position) {//根据位置获取对象 return list.get(position); } @Override public long getItemId(int position) {//根据位置获取ID return position; } @Override //获取一个条目视图 public View getView(int position, View convertView, ViewGroup parent) { //重用convertView View item = convertView!=null?convertView : View.inflate(getApplicationContext(), R.layout.item, null); //获取视图中的TextView TextView idTV = (TextView) item.findViewById(R.id.idIV); TextView nameTV = (TextView) item.findViewById(R.id.nameTV); TextView balanceTV = (TextView) item.findViewById(R.id.balanceTV); //根据当前位置获取Account对象 final Account a = list.get(position); //把Account对象中的数据放到TextView中 idTV.setText(a.getId() + ""); nameTV.setText(a.getName()); balanceTV.setText(a.getBalance() + ""); ImageView upIV = (ImageView) item.findViewById(R.id.upIV); ImageView downIV = (ImageView) item.findViewById(R.id.downIV); ImageView deleteIV = (ImageView) item.findViewById(R.id.deleteIV); //向上箭头的点击事件触发的情绪 upIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { a.setBalance(a.getBalance() + 1);//修改值 notifyDataSetChanged();//刷新界面 dao.update(a);//更新数据库 } }); //向下箭头的点击事件触发的方法 downIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { a.setBalance((a.getBalance() - 1)); notifyDataSetChanged(); dao.update(a); } }); //删除图片的点击事件触发的方法 deleteIV.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //删除数据之前首先先弹出一个对话框 android.content.DialogInterface.OnClickListener listener=new android.content.DialogInterface.OnClickListener(){ @Override public void onClick(DialogInterface dialog, int which) { list.remove(a);//从集合中删除 dao.delete(a.getId());//从数据库中删除 notifyDataSetChanged();//刷新界面 } }; //创建对话框 AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this); builder.setTitle("确定要删除吗?");//设置标题 builder.setPositiveButton("确定", listener); builder.setNegativeButton("取消", null); builder.show();//显示对话框 } }); return item; } } //ListView的Item点击事件 private class MyOnItemClickListener implements AdapterView.OnItemClickListener{ @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Account a = (Account) parent.getItemAtPosition(position); Toast.makeText(getApplicationContext(), a.toString(), Toast.LENGTH_SHORT).show(); } }}
7.运行程序展示商品信息 运行程序时首先添加商品名称以及金额,点击加号就会将Edittext中输入的内容添加至数据库并显示适配到ListView中。多添加几条数据,然后点击某条数据的向上的按钮,金额就会增加。向下按钮同理。点击某条数据的删除图案,会弹出一个对话框,确认后就能删除数据了。单击某条数据室,会弹出toast。 1、添加商品以及金额以及弹出toast 2、删除商品数据 3、增加减少商品价格
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android(安卓)socket高级用法(自定义协议和Protocol Buffer使用)
- Android课程表的设计开发
- Android:LiveData postValue导致数据丢失问题,及其原因
- Android(安卓)Camera API2中采用CameraMetadata用于从APP到HAL的
- android TIPS小结
- Android(安卓)架构组件 - 让天下没有难做的 App