您的位置:首页 > 移动开发 > Android开发

Android案例:商品展示

2017-04-25 14:34 337 查看

1、案例:



开发一个购物车,将购物车中的商品以列表的形式进行显示,并且还要对购物车中的商品进行增删改查操作,运用ListView和SQLite数据库。

2、案例实现:

(1)、只给出主要代码,界面设计不再给出。

(2)、创建数据库:

新建MyHelper类继承自SQLiteOpenHelper,SQLiteOpenHelper是一个抽象类,他有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类中重写这两个方法,在这两个方法中去实现创建、升级数据库的逻辑。

public class MyHelper extends SQLiteOpenHelper {

    public MyHelper(Context context) {

        super(context,"itcast.db",null,1);

    }

    @Override

    public void onCreate(SQLiteDatabase db) {

        System.out.println("onCreate");

        db.execSQL("CREATE TABLE account(_id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(20),//商品名称列
balance INTEGER)");//金额列

        

    }

    @Override

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        System.out.println("onUpgrade");

    }

}

SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可

以创建或打开一个现有的数据库(如果数据库已经存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读

写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以只读的

方式打开数据库,而getWritableDatabase()方法则将出现异常。

同时,SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数较少的构造方法即可。这个构造方法接收四个参数,第

一个是Context,必须有他才能对数据库进行操作;第二个是数据库名,创建数据库时使用的就是这里指定的名称;第三是允许我们

在查询数据时返回一个自定义的Cursor,一般传入null;第四个参数表示当前数据库的版本号,可用于对数据库进行更新操作。构建

处SQLiteOpenHelper的实例后,再调用他的getReadableDatabase()或getWritableDatabase()就能够创建数据库了。

(3)、创建Account类

在操作数据库时将数据存放至一个JavaBean对象中操作起来会比较方便。

public class Account {

    private Long id;

    private String name;

    private int balance;

    public Account(Long id, int balance, String name) {

        this.id = id;

        this.balance = balance;

        this.name = name;

    }

    public Long getId() {

        return id;

    }

    public void setId(Long id) {

        this.id = id;

    }

    public Integer getBalance() {

        return balance;

    }

    public void setBalance(Integer balance) {

        this.balance = balance;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Account(int i, String name){

        super();

    }

    public String toString(){

        return "{序号:"+id+",商品名称:"+name+",余额:"+balance+"}";

    }

}

(4)、创建数据操作逻辑类

前面创建好数据库和JavaBean后,创建一个AccountDao类用于操作数据。

public class AccountDao {

    private MyHelper helper;

    public AccountDao(Context context){

        helper = new MyHelper(context);

    }

    public void insert(Account account){

        SQLiteDatabase db = helper.getWritableDatabase();

        ContentValues values = new ContentValues();

        values.put("name",account.getName());

        values.put("balance",account.getBalance());

        long id = db.insert("account",null,values);

        account.setId(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<Account> queryAll() {

        SQLiteDatabase db = helper.getReadableDatabase();

        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,balance,name));

        }

        c.close();

        db.close();

        return list;

    }

}

在上面代码的insert()方法中调用了db.insert()方法,这个方法第二个参数如果传入的是null,是无法插入一条空数据的。如果想插一条空入数据,第二个参数必须写一个列名(任意列),传入的这个列名是用来拼接SQL语句的。

(5)、编写界面交互代码

public class MainActivity extends Activity {

    private List<Account> list;

    private AccountDao dao;

    private EditText nameET;

    private EditText priceET;

    private MyAdapter adapter;

    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);

    }

    private void initView() {

        accountLV = (ListView) findViewById(R.id.shopList);

        nameET = (EditText) findViewById(R.id.shopName);

        priceET = (EditText) findViewById(R.id.shopPrice);

        accountLV.setOnItemClickListener(new MyOnItemClickListener());

    }

    public void add(View v){

        String name = nameET.getText().toString().trim();

        String balance = priceET.getText().toString().trim();

        Account a = new Account(balance.equals("")?0

                :Integer.parseInt(balance),name);

        dao.insert(a);

        list.add(a);

        adapter.notifyDataSetChanged();

        accountLV.setSelection(accountLV.getCount()-1);

        nameET.setText("");

        priceET.setText("");

    }

    private class MyAdapter extends BaseAdapter {

        private List<Account> list;

        @Override

        public int getCount() {

            return list.size();

        }

        @Override

        public Object getItem(int position) {

            return list.get(position);

        }

        @Override

        public long getItemId(int position) {

            return position;

        }

        @Override

        public View getView(int position, View convertView, ViewGroup parent) {

            View item = convertView != null?convertView:View.inflate(

                    getApplicationContext(),R.layout.item,null);

            TextView idTV = (TextView) item.findViewById(R.id.idTV);

            TextView nameTV = (TextView) findViewById(R.id.nameTV);

            TextView priceTV = (TextView) findViewById(R.id.priceTV);

            final Account a = list.get(position);

            idTV.setText(a.getId()+"");

            nameTV.setText(a.getName());

            priceTV.setText(a.getBalance()+"");

            ImageView upIV = (ImageView) item.findViewById(R.id.upIV);

            ImageView downIV = (ImageView) item.findViewById(R.id.downTV);

            ImageView deleteIV = (ImageView) item.findViewById(R.id.deleteTV);

            //向上箭头的点击事件

            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.setPositiveButton("取消",listener);

                    builder.show();

                }

            });

            return 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();

        }

    }

}

上述代码中ListView的setOnItemClickList
9c1c
ener()方法用于监听Item的点击事件,在使用该方法时需要传入一个OnItemClickListener的实现类对象,并且需要实现onItemClick方法。当点击ListView的Item时就会触发Item的点击事件然后会回调onItemClick()方法.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: