Android案例:商品展示

1、案例:

Android案例:商品展示_第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 queryAll() {
        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor c = db.query("account",null,null,null,null,null,"balance DESC");
        List list = 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,balance,name));
        }
        c.close();
        db.close();
        return list;
    }
}

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

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

public class MainActivity extends Activity {


    private List 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 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的setOnItemClickListener()方法用于监听Item的点击事件,在使用该方法时需要传入一个OnItemClickListener的实现类对象,并且需要实现onItemClick方法。当点击ListView的Item时就会触发Item的点击事件然后会回调onItemClick()方法.




你可能感兴趣的:(Android)