以列表ListView显示购物车的商品

来源:互联网 发布:想做淘宝客怎么申请 编辑:程序博客网 时间:2024/05/17 23:31

案例:开发一个购物车,需要将购物车中的商品以列表的形式显示,并且还要对购物车中的商品进行增,删,改,查操作,利用ListView和SQLite数据库。
1,创建程序
首先创建一个名为“商品展示”的应用程序,设计用户界面,如下图所示:
这里写图片描述
“商品展示”程序对应的布局文件如下所示:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="bzu.edu.cn.lab7_4.MainActivity"    android:orientation="horizontal"><LinearLayout    android:id="@+id/headLL"    android:layout_width="match_parent"    android:layout_height="wrap_content">    <EditText        android:id="@+id/nameET"        android:layout_width="0dp"        android:layout_weight="2"        android:layout_height="wrap_content"        android:hint="商品名称"        android:inputType="textPersonName"/>    <EditText        android:id="@+id/balanceET"        android:layout_width="0dp"        android:layout_weight="2"        android:layout_height="wrap_content"        android:hint="金额"        android:inputType="number"/>    <ImageView        android:onClick="add"        android:id="@+id/addIV"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@android:drawable/ic_input_add"/></LinearLayout>    <ListView        android:id="@+id/accountLV"        android:layout_marginTop="40dp"        android:layout_marginLeft="1dp"        android:layout_width="match_parent"        android:layout_height="match_parent">    </ListView></LinearLayout>

2,创建ListView Item布局,在res/layout目录下创建一个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="match_parent">    <TextView        android:id="@+id/idTV"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="1"        android:text="1"        android:textSize="20sp" />    <TextView        android:id="@+id/nameTV"        android:layout_width="0dp"        android:layout_height="wrap_content"        android:layout_weight="2"        android:text="PQ"        android:textColor="#000000"        android:singleLine="true"        android:textSize="20sp" />    <TextView        android:id="@+id/balanceTV"        android:layout_width="0dp"         android:textColor="#000000"        android:layout_height="wrap_content"        android:layout_weight="2"        android:text="100"         android:singleLine="true"        android:textSize="20sp" />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:orientation="vertical"        android:layout_marginTop="5dp">        <ImageView            android:id="@+id/upIV"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginBottom="2dp"            android:src="@android:drawable/arrow_up_float" />        <ImageView            android:id="@+id/downIV"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:src="@android:drawable/arrow_down_float" />    </LinearLayout>    <ImageView        android:id="@+id/deleteIV"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@android:drawable/ic_menu_delete" /></LinearLayout>

3,创建数据库
创建数据库属于数据操作,创建一个名为dao的包,并在该包下定义一个MyHelper类继承SQLiteOpenHelper,创建代码如下:

package bzu.edu.cn.lab7_4.dao;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;/** * Created by Administrator on 2017/4/17. */public class MyHelper extends SQLiteOpenHelper{    public MyHelper(Context context){        super(context,"itcast.db",null,2);    }   public void onCreate(SQLiteDatabase db){       System.out.println("onCreate()");       db.execSQL("create table account(_id integer primary key autoincrement,name varchar(20),balance integer)");   }    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){        System.out.println("onUpgrade()");    }}

4,创建Account类
创建一个名为bean的包存放Javabean类,并在bean包下定义一个Account类,具体代码如下:

package bzu.edu.cn.lab7_4.bean;/** * Created by Administrator on 2017/4/22. */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();    }    public String toString(){        return "[序号:"+id+",商品名称:"+name+",余额:"+balance+"]";    }}

5,创建数据操作逻辑类
创建一个AccountDao类用于操作数据,代码如下:

import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.util.Log;import java.util.ArrayList;import java.util.List;/** * Created by Administrator on 2017/4/22. */public class AccountDao {    private MyHelper helper;    public AccountDao(Context context){        helper=new MyHelper(context);    }    //添加数据    public void insert(Account account){        //获取数据库对象        SQLiteDatabase db=helper.getWritableDatabase();        //用来装载要插入数据的Map(列名,列的值)        ContentValues values=new ContentValues();        values.put("name",account.getName());        values.put("balance",account.getBalance());        //向表中插入数据        long id=db.insert("account",null,values);        //queryAll();        account.setId(id);        db.close();//关闭数据库    }    //根据id删除数据    public int delete(long id){        SQLiteDatabase db=helper.getWritableDatabase();        //根据指定的id删除表中的数据,返回受欢迎的行数        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<Account> queryAll(){        SQLiteDatabase db=helper.getWritableDatabase();        Cursor c=db.query("account",null,null,null,null,null,"balance DESC");        List<Account> list=new ArrayList<Account>();        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));            //System.out.println("name:"+name+"balance: "+balance+" id:"+id);        }        c.close();        db.close();        return list;    }}

6,编写界面交互代码
数据库的操作完成之后需要界面月数据库进行交互,用于实现将数据库的数据以ListView的形式展示在界面上,具体代码如下:

import java.util.List;import bzu.edu.cn.lab7_4.bean.Account;import bzu.edu.cn.lab7_4.dao.AccountDao;public class MainActivity extends AppCompatActivity {    //需要适配的数据集合    private List<Account> list;    private AccountDao dao;    private ImageView addIV;    //输入名称的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();        //给ListView添加适配器(自动把数据生成条目)        accountLV.setAdapter(adapter);    }    //初始化控件    private void initView(){        addIV= (ImageView) findViewById(R.id.addIV);        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若是空字符串则为0,否则进行类型转换       // Log.d("Ma","add方法dd");        Account a=new Account(name,balance.equals("")?0:Integer.parseInt(balance));        //Log.i("Ma","add方法ii");        dao.insert(a); //插入数据库        list.add(a);   //插入集合        adapter.notifyDataSetChanged();//刷新界面        //选中最后一个        accountLV.setSelection(accountLV.getCount()-1);        nameET.setText("");        balanceET.setText("");    }    //自定义一个适配器(把数据装到ListView的工具)    private class MyAdapter extends BaseAdapter{        public int getCount(){  //获取条目总数            return list.size();        }        public Object getItem(int position){ //根据位置获取对象            return list.get(position);        }        public long getItemId(int position){ //根据位置获取id            return position;        }        //获取一个条目视图        public View getView(int position, View convertView, ViewGroup parent){            //重用convertView            View item=convertView!=null?convertView:View.inflate(getApplicationContext(),R.layout.list_item,null);            //获取该视图中的TextView            TextView idTV=(TextView)item.findViewById(R.id.idTV);            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(){                                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{        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,编写完毕,测试程序,运行结果如下图:
1)
这里写图片描述
2)可以实现删除数据操作,并在数据库表中也删除记录
这里写图片描述

0 0