本案例使用自定義佈局實現在ListView中顯示數據庫的數據(用戶名、手機號)的功能,ListView向上滑動可以加載更多數據。
1.user_item.xml
<?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" >
<TextView
android:id="@+id/tv_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_weight="1"
android:text="chj" />
<TextView
android:id="@+id/tv_phone"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:text="13527168697" />
<Button
android:id="@+id/btn_call"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="撥號" />
<Button
android:id="@+id/btn_sms"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="信息" />
</LinearLayout>
2.在activity_main.xml中添加ListView控件 id=”@+id/lv_users”
3.自定義的adapter UserAdapter.java
package com.example.dbhytc.adapter;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.dbhytc.R;
import com.example.dbhytc.SmsActivity;
public class UserAdapter extends BaseAdapter {
private Context context;
private List<Map<String, Object>> data;
private ViewHolder viewHolder;
public UserAdapter(Context context, List<Map<String, Object>> data) {
this.context = context;
this.data = data;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return data.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return data.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = View.inflate(context, R.layout.user_item, null);
viewHolder.tv_name = (TextView) convertView
.findViewById(R.id.tv_name);
viewHolder.tv_phone = (TextView) convertView
.findViewById(R.id.tv_phone);
viewHolder.btn_call = (Button) convertView
.findViewById(R.id.btn_call);
viewHolder.btn_sms = (Button) convertView
.findViewById(R.id.btn_sms);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// 賦值
Map map = data.get(position);
viewHolder.tv_name.setText(map.get("name").toString());
final String phone = map.get("phone").toString();
viewHolder.tv_phone.setText(phone);
viewHolder.btn_call.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "打電話", 1).show();
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"
+ phone));
context.startActivity(intent);
}
});
viewHolder.btn_sms.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "發信息", 1).show();
// 執行一個意圖 打開發短信界面
// 1.定義一個意圖
Intent intent = new Intent(context, SmsActivity.class);
// 通過這個意圖可以附帶數據
intent.putExtra("phone", phone);
// 2.執行意圖
context.startActivity(intent);
}
});
return convertView;
}
class ViewHolder {
public TextView tv_name, tv_phone;
public Button btn_call, btn_sms;
}
}
4.HytcSQLiteOpenHelper.java
package com.example.dbhytc.db;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class HytcSQLiteOpenHelper extends SQLiteOpenHelper{
//數據庫的名稱
private static String name="hytc.db";
//數據庫的版本
private static Integer version=2;
/**
* 只需保證 在實例化子類對象時,保證父類對象先實例化
* @param context
*/
public HytcSQLiteOpenHelper(Context context) {
super(context, name, null, version);
}
/**
* 第一次執行的時候創建數據庫
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE user (id integer primary key autoincrement, name varchar(20))");
}
/**
* 當版本號發生變化的時候 觸發
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table user add column phone varchar(11)");
}
}
5.UserDao中定義了查詢數據data集合的方法getObjects()及得到總頁數的方法getPages()
package com.example.dbhytc.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.dbhytc.db.HytcSQLiteOpenHelper;
public class UserDao {
// 數據庫管理操作對象
private HytcSQLiteOpenHelper helper;
private List<Map<String, Object>> data;
private int pagesize = 12;
public UserDao(List<Map<String, Object>> data, Context context) {
this.data = data;
helper = new HytcSQLiteOpenHelper(context);
}
/**
* 查詢方法
*/
public void getObjects(Integer nowpage) {
// 獲取SQLiteDatabase對象
SQLiteDatabase db = helper.getReadableDatabase();
// 計算開始的記錄數
int startSize = (nowpage - 1) * pagesize;
Cursor c = db.rawQuery("select id,name,phone from user limit ?,?",
new String[] { startSize + "", pagesize + "" });
while (c.moveToNext()) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", c.getString(c.getColumnIndex("name")));
map.put("phone", c.getString(c.getColumnIndex("phone")));
map.put("id", c.getInt(c.getColumnIndex("id")));
data.add(map);
}
c.close();
db.close();
}
public int getPages() {
int pages = 0;
// 獲取SQLiteDatabase對象
SQLiteDatabase db = helper.getReadableDatabase();
// 計算開始的記錄數
Cursor c = db.rawQuery("select count(*) as c from user", null);
if (c.moveToNext()) {
int count = c.getInt(c.getColumnIndex("c"));
//計算總頁數
pages = count % pagesize == 0 ? count / pagesize : count / pagesize
+ 1;
}
c.close();
db.close();
return pages;
}
}
6.MainActivity.java
package com.example.dbhytc;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewTreeObserver.OnScrollChangedListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import com.example.dbhytc.adapter.UserAdapter;
import com.example.dbhytc.dao.UserDao;
public class MainActivity extends Activity implements OnScrollListener {
// 聲明控件
private ListView lv_users;
private UserDao userDao;
private List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
private int nowpage = 1;
private boolean isLastRow = false;
private UserAdapter adapter;
private int pages;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 獲取控件對象
lv_users = (ListView) findViewById(R.id.lv_users);
// 數據
userDao = new UserDao(data, this);
// 查詢出總頁數
pages = userDao.getPages();
userDao.getObjects(nowpage);
adapter = new UserAdapter(this, data);
// 設置適配器
lv_users.setAdapter(adapter);
// 註冊事件監聽 滾動的事件
lv_users.setOnScrollListener(this);
}
/**
* 當scrollstate改變的時候 都會觸發該函數 scrollstate 0 空閒 1滾動 2拋 1 0 1 2 0
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 判斷是否是最後一行
if (isLastRow) {
// 再判斷是否停止滾動
if (scrollState == SCROLL_STATE_IDLE) {
// pages = userDao.getPages();
if (nowpage < pages) {
// 讓當前頁加1
nowpage = nowpage + 1;
// 假設往這個集合中添加數據
userDao.getObjects(nowpage);
// 通知變化
adapter.notifyDataSetChanged();
}
}
// 改變值
isLastRow = false;
}
}
/**
* 當滾動的時候觸發的函數 firstVisibleItem:條目可見第一個位置值 visibleItemCount:條目可見的數量
* totalItemCount data集合數量 條目總個數
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// 判斷
if ((firstVisibleItem + visibleItemCount) >= totalItemCount) {
isLastRow = true;
}
}
}