1. 程式人生 > >Android——(SQLite資料庫)ListView控制元件之商品展示案例

Android——(SQLite資料庫)ListView控制元件之商品展示案例

一、實驗目的

開發一個購物車,需要將購物車中的商品以列表的形式展示,並且還需要對購物車中的商品進行增刪改查操作。要實現這些功能就需要使用 ListView 和 SQLite 資料庫。

二、 訓練目標

1) 掌握 SQLite 儲存方式

2) 掌握如何使用 SQLite 完成 CRUD 操作

三、實驗步驟:

1、首先建立程式,設計使用者互動介面。此程式對應的佈局檔案(activity_main.xml)如下所示:

<?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:orientation="vertical"
    android:layout_margin="8dp"
    tools:context="cn.edu.bzu.productshow.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/addLL"
        android:orientation="horizontal"
        >
        <EditText
            android:id="@+id/nameET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="商品名稱"
            android:inputType="textPersonName" />
        <EditText
            android:id="@+id/balanceET"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            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_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/addLL">
    </ListView>
</LinearLayout>

android:src="@android:drawable/ic_input_add" 顯示圖片的原圖大小

效果圖展示:

2.建立ListView 

Item佈局 在res/layout下建立一個item.xml檔案,建立三個TextView和三個ImageView,程式碼如下:

<?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"
    android:orientation="horizontal"
    android:padding="10dp"
    >

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/idIV"
        android:text="13"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:id="@+id/nameTV"
        android:text="PQ"
        android:textColor="#000000"
        android:textSize="20sp"
        android:singleLine="true"
        />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:id="@+id/balanceTV"
        android:text="12345"
        android:singleLine="true"
        android:textColor="#000000"
        android:textSize="20sp"
        />
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <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>

 新增的三個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<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,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<Account> 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、增加減少商品價格