ListView显示数据库的数据-采用自定义布局-向上滑动可以加载更多数据
2015-05-26 23:28
519 查看
本案例使用自定义布局实现在ListView中显示数据库的数据(用户名、手机号)的功能,ListView向上滑动可以加载更多数据。
1.user_item.xml
2.在activity_main.xml中添加ListView控件 id=”@+id/lv_users”
3.自定义的adapter UserAdapter.java
4.HytcSQLiteOpenHelper.java
5.UserDao中定义了查询数据data集合的方法getObjects()及得到总页数的方法getPages()
6.MainActivity.java
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; } } }
相关文章推荐
- 自定义ListView实现上拉分页加载更多数据
- listView加载大量数据的优化(之尾布局实现分页加载更多)
- Android 自定义一个可以展开显示更多的文本布局
- Android自定义PullListView下拉刷新,上拉加载更多分页数据
- 点击加载更多(适用于listview在scrollview单行显示修正后多数据加载慢的情况)
- [Android]自定义一个可以展开显示更多的文本布局
- (原创)使用AsyncTask(带修改线程池方式)+自定义ImageLoader+LRU算法对图片三级缓存及其显示优化(只有在ListView滑动停止的时候才去网络请求获取图片数据)
- ListView的Item可以跳转到指定的页面,但是无法显示布局和数据
- listview中使用checkbox滑动或者加载更多数据错乱问题解决方案
- Android 自定义一个可以展开显示更多的文本布局
- android下拉刷新和滑动到底部加载更多,自定义listview
- 【Android】提升用户体验,ListView显示加载中动画及空数据视图
- Android 为什么我的PullListView只能向下滑动,不能向上滑动加载更多???
- ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定数据(一)
- ListView的Adapter使用(绑定数据) 之 自定义每一项的布局去绑定数据
- Android学习笔记---19_采用ListView实现数据列表显示,以及各种适配器使用,和如何写自己的适配器
- Android Listview滑动时不加载数据 停止时加载数据
- UWP-ListView到底部自动加载更多数据
- android--自定义ExpandableListView+隐藏指示器图片+防数据显示混乱