ListView顯示數據庫的數據-採用自定義佈局-向上滑動可以加載更多數據

本案例使用自定義佈局實現在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;
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章