前言
該程序有兩個版本,1是實現item使用,以及界面的增刪;2增加了SQLite數據庫的使用,可以保存數據。
一、主要知識點
1.item佈局
主要運用ListView
<ListView
android:id="@+id/accountLV"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below = "@+id/addLL">
</ListView>
2.BaseAdapter數據適配器
首先要繼承BaseAdapter,實現下面代碼中的四個函數
class MyBaseAdapter extends BaseAdapter{
public int getCount(){
return list.size();
}
public Object getItem(int position){
return list.get(position);
}
public long getItemId(int position){
return position;
}
//得到需要返回的條目
public View getView(int position, View convertView, ViewGroup parent){
return item;
}
}
運用
//定義
private MyBaseAdapter adapter;
//初始化
adapter = new MyBaseAdapter();
//ListView類運用
ListView accountLV.setAdapter(adapter);
更詳細參考博文:http://www.cnblogs.com/mandroid/archive/2011/04/05/2005525.html
3.ListView的setSelection函數
一般來說,listview的數據是按輸入順序存放的,
這個函數的目的是輸入後把光標移動到你輸入的一行listview。
例如你的屏幕能放下10條數據,當你輸入11條數據後,你將能看到第11條數據
例如輸入商品名稱:毛巾 金額:5
運用setSelection函數後顯示
不運用setSelection函數後顯示
4.List集合類
要記得實例化。
5.adapter.notifyDataSetChanged函數
刷新數據,重新調用BaseAdapter類的getView函數。
6.setOnItemClickListener(暫時沒有領會用途)
7.SQLite數據庫的使用
(1)繼承SQLiteOpenHelper完成數據庫表的創建
(2)創建數據庫操作類。
在操作類中定義數據庫
//shujuku是我繼承SQLiteOpenHelper的類名
private shujuku helper;
public AccountDao(Context context){
helper = new shujuku(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();
}
刪
//刪除數據
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.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));
}
c.close();
db.close();
return list;
}
8.ContentValues類
//ContentValues 和HashTable類似都是一種存儲的機制 但是兩者最大的區別就在於,
// contenvalues只能存儲基本類型的數據,像string,int之類的,不能存儲對象這種東西,而HashTable卻可以存儲對象。
//在忘數據庫中插入數據的時候,首先應該有一個ContentValues的對象所以:
//ContentValues initialValues = new ContentValues();
//initialValues.put(key,values);
// SQLiteDataBase sdb ;
// sdb.insert(database_name,null,initialValues);
//插入成功就返回記錄的id否則返回-1;
9.SQLiteDatabase中的query
//public SQLiteDatabase query (String table, String[] columns, String selection, String[] selectionArgs,
//String groupBy, String having, String orderBy, String limit)
二、犯下的錯誤
1.佈局沒有做好,導致遮擋。
2.沒有認清錯誤的方向,花費了做錯誤的時間,因禍得福,對程序有了更一步的瞭解。
3.app下載到手機後,打開閃退。原因是定義了list沒有實例化,在後續運用了list。
三、原碼
1.兩個版本相同的xml文件
(1)主界面:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_margin="8dp"
tools:context="com.myapplication.MainActivity">
<LinearLayout
android:id="@+id/addLL"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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"/>
<Button
android:id="@+id/addIV"
android:text="增加商品"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ListView
android:id="@+id/accountLV"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below = "@+id/addLL">
</ListView>
</LinearLayout>
(2)item:
<?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:id="@+id/idTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="13"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/nameTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:singleLine="true"
android:text="PQ"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/balanceTV"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="12345"
android:textColor="#000000"
android:textSize="20sp" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/upIV"
android:layout_width="25sp"
android:layout_height="15sp"
android:text="增加金額"
android:layout_marginBottom="2dp"/>
<Button
android:id="@+id/downIV"
android:layout_width="25sp"
android:layout_height="15sp"
android:text="減少金額"
android:layout_marginBottom="2dp"/>
</LinearLayout>
<Button
android:id="@+id/deleteIV"
android:layout_width="25dp"
android:layout_height="25dp"
android:text="刪除數據"/>
</LinearLayout>
2.代碼
(1)沒有數據庫版本
MainActivity
package com.myapplication;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private EditText nameET;
private EditText balanceET;
private Button addIV;
private ListView accountLV;
private MyBaseAdapter adapter;
private List<Account> list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameET = (EditText)findViewById(R.id.nameET);
balanceET = (EditText)findViewById(R.id.balanceET);
addIV = (Button) findViewById(R.id.addIV);
accountLV = (ListView) findViewById(R.id.accountLV);
accountLV.setOnItemClickListener(new MyOnItemClickListener());
adapter = new MyBaseAdapter();
accountLV.setAdapter(adapter);
addIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String name = nameET.getText().toString().trim();
String balance = balanceET.getText().toString().trim();
Account a = new Account(name,balance.equals("")?0:Integer.parseInt(balance));
list.add(a);
adapter.notifyDataSetChanged();//刷新界面
//一般來說,listview的數據是按輸入順序存放的,
// 這個函數的目的是輸入後把光標移動到你輸入的一行listview
accountLV.setSelection(accountLV.getCount()-1);
nameET.setText("");
balanceET.setText("");
}
});
}
class MyBaseAdapter extends BaseAdapter{
public int getCount(){
return list.size();
}
public Object getItem(int position){
return list.get(position);
}
public long getItemId(int position){
return position;
}
//因此如果你的Activity裏如果用到別的layout,比如對話框上的layout,
// 你還要設置對話框上的layout裏的組件(像圖片ImageView,文字TextView)上的內容,
// 你就必須用inflate()先將對話框上的layout找出來,然後再用這個layout對象去找到它上面的組件
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) item.findViewById(R.id.nameTV);
TextView balanceTV =(TextView) item.findViewById(R.id.balanceTV);
final Account a = list.get(position);
idTV.setText(a.getId()+"");
nameTV.setText(a.getName());
//nameTV.setText(names[position]);
balanceTV.setText(a.getBalance()+"");
Button upIV = (Button) item.findViewById(R.id.upIV);
Button downIV = (Button) item.findViewById(R.id.downIV);
Button deleteIV = (Button) item.findViewById(R.id.deleteIV);
upIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
a.setBalance(a.getBalance()+1);
notifyDataSetChanged();
}
});
downIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
a.setBalance(a.getBalance()-1);
notifyDataSetChanged();
}
});
deleteIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
android.content.DialogInterface.OnClickListener listener = new android.content.DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog, int which){
list.remove(a);
notifyDataSetChanged();
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("確定要刪除嗎?");
builder.setPositiveButton("確定",listener);
builder.setNegativeButton("取消",null);
builder.show();
}
});
return 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();
}
}
}
數據類Account
package com.myapplication;
/**
* Created by 鍾鍾 on 2017-05-06.
*/
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+"]";
}
}
(2)SQLite數據庫版本
MainActivity
package com.myapplication;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
/*
public class MainActivity extends AppCompatActivity {
private ListView mList;
private String[] names= {"12","23","34","25","78","910","11","7","12"};
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mList = (ListView)findViewById(R.id.accountLV);
}
class MyBaseAdapter extends BaseAdapter{
public int getCount(){
return names.length;
}
public Object getItem(int position){
return names[position];
}
public long getItemId(int position){
return position;
}
@Override
public View getView(int positon, View convertView, ViewGroup parent) {
View view = View.inflate(MainActivity.this,R.layout.list_item,null);
TextView m =(TextView) view.findViewById(R.id.nameTV);
m.setText(names[positon]);
return view;
}
}
}
*/
public class MainActivity extends AppCompatActivity {
private List<Account> list;
private AccountDao dao;
private EditText nameET;
private EditText balanceET;
private MyBaseAdapter adapter;
private ListView accountLV;
private String[] names= {"12","23","34","25","78","910","11","7","12"};
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();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化ListView控件
initView();
dao = new AccountDao(this);
list = dao.queryAll();
adapter = new MyBaseAdapter();
accountLV.setAdapter(adapter);
//accountLV.setAdapter(new ArrayAdapter<String>(this,R.layout.list_item,R.id.accountLV),names);
}
public void initView(){
accountLV = (ListView)findViewById(R.id.accountLV);
nameET = (EditText)findViewById(R.id.nameET);
balanceET = (EditText)findViewById(R.id.balanceET);
//accountLV.setOnItemClickListener(new MyOnItemClickListener());
}
public void add(View v){
String name = nameET.getText().toString().trim();
String balance = balanceET.getText().toString().trim();
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("");
}
//類繼承BaseAdapter
//BaseAdapter就Android應用程序中經常用到的基礎數據適配器,
// 它的主要用途是將一組數據傳到像ListView、Spinner、Gallery及GridView等UI顯示組件,它是繼承自接口類Adapter,
class MyBaseAdapter extends BaseAdapter{
public int getCount(){
return list.size();
}
public Object getItem(int position){
return list.get(position);
}
public long getItemId(int position){
return position;
}
//因此如果你的Activity裏如果用到別的layout,比如對話框上的layout,
// 你還要設置對話框上的layout裏的組件(像圖片ImageView,文字TextView)上的內容,
// 你就必須用inflate()先將對話框上的layout找出來,然後再用這個layout對象去找到它上面的組件
public View getView(int position, View convertView, ViewGroup parent){
View item = convertView!=null?convertView:View.inflate(getApplicationContext(),R.layout.list_item,null);
TextView idTV =(TextView) item.findViewById(R.id.idTV);
TextView nameTV =(TextView) item.findViewById(R.id.nameTV);
TextView balanceTV =(TextView) item.findViewById(R.id.balanceTV);
final Account a = list.get(position);
idTV.setText(a.getId()+"");
nameTV.setText(a.getName());
//nameTV.setText(names[position]);
balanceTV.setText(a.getBalance()+"");
Button upIV = (Button) item.findViewById(R.id.upIV);
Button downIV = (Button) item.findViewById(R.id.downIV);
Button deleteIV = (Button) item.findViewById(R.id.deleteIV);
upIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
a.setBalance(a.getBalance()+1);
notifyDataSetChanged();
dao.update(a);
}
});
downIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
a.setBalance(a.getBalance()-1);
notifyDataSetChanged();
dao.update(a);
}
});
deleteIV.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
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;
}
}
}
數據庫類
package com.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by 鍾鍾 on 2017-05-05.
*/
public class shujuku extends SQLiteOpenHelper{
public shujuku(Context context){
super(context,"itcast.db",null,2);
}
public void onCreate(SQLiteDatabase db){
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");
}
}
數據庫操作類(增刪改查)
package com.myapplication;
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;
/**
* Created by 鍾鍾 on 2017-05-05.
*/
public class AccountDao {
private shujuku helper;
public AccountDao(Context context){
helper = new shujuku(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();
}
//刪除數據
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.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));
}
c.close();
db.close();
return list;
}
}