Android——(SQLite資料庫)ListView控制元件之商品展示案例
阿新 • • 發佈:2019-02-12
一、實驗目的
開發一個購物車,需要將購物車中的商品以列表的形式展示,並且還需要對購物車中的商品進行增刪改查操作。要實現這些功能就需要使用 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。具體程式碼如下:
5.建立資料操作邏輯類 在cn.edu.bzu.productshow.Dao包下建立一個AccountDao類用於操作資料。具體程式碼如下: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 + "]"; } }
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、增加減少商品價格