Android SQLite与ListView的简单使用

男儿欲遂平生志,五经勤向窗前读。这篇文章主要讲述Android SQLite与ListView的简单使用相关的知识,希望能为你提供帮助。
2017-04-25
初写博客有很多地方都有不足,希望各位大神给点建议。
回归主题,这次简单的给大家介绍一下android SQLite与ListView的简单使用sqlite在上节中有介绍,所以在这里废话不多说了,重点说一下listview的使用及优化
listView的概述:
 在 Android 应用开发中,ListView 是最为常见的组件之一。它将数据以列表的形式展现出来,在我们平时的开发中也是很常见。一般而言,一个ListView 由以下三个元素组成:
①View:用来展示列表的 View,通常是一个 XML 文件所指定的。
②适配器:用来把数据映射到 ListView 上,可以理解为 ListView 界面和数据之间的纽带和桥梁。
③数据:具体被映射的数据和资源,可以是字符串、图片等。
接下来我们简单介绍一下 ListView 加载数据的原理。有了这方面的了解后再说优化才行。ListView 针对每个 item(列表项)都要求 adapter(适配器)“返回一个视图”(getView)。 ListView 在开始绘制的时候系统会首先调用 getCount()函数,根据它的返回值得到 ListView 的长度,然后根据这个长度,逐次调用 getView()方法一行一行的绘制ListView 的每一项。getCount()方法的返回值是几就显示几行。 具体怎么绘制呢?当我们调用 getView()方法时首先会通过加载布局文件生成一个新的 View 对象(实际上是一 个 ViewGroup),然后通过该对象将布局文件中的各个组件实例化(也就是 findViewById()), 这样便可将数据对应到各个组件上了。但是加载布局文件属于 I/O 操作,是很耗时的,当我们的数据量非常庞大或者列表项非常多的时候,很容易导致 ANR(应用程序无响应)现象。
1.listview的优化方案之__复用历史缓存
所谓的复用,就是循环反复的利用。假如说我们有一百条列表项,我们没有必要一一为他们创建新的对象,我们只要创建三个或者五个 item 对象,之后对他们循环利用即可。 其实 Android 系统本身为我们考虑了 ListView 的优化问题。在 getView()方法中系统就为我们提供了一个复用 View 的历史缓存对象 convertView,当显示第一屏的时候,每一个 item都会新创建一个 View 对象,这些 View 都是可以被复用的。 此时 convertView 在 getView()中是空值。假如说是 item1 滚动出屏幕时会进入到一个叫 Recycler 的 Android构件中去填充 convertView 并缓存起来,当新的项目从屏幕底端上来时,ListView 调用getView()方法,convertView 此时不是空值了,它的值是 item1。 你只需要设置新的数据,然后返回 convertView,不必重新创建一个视图
2.istview的优化方案之__缓存 item 条目的引用—ViewHolder
findViewById()这个方法是比较耗性能的操作。当我们通过加载布局文件来创建 View 对象的时候,一但该对象生成,其布局文件中子控件的 id 也就不会改变了,因此我们在第一次加载的时候,需要将把相关的数据保存起来,下次直接从缓存中读取,从而减少findViewById()的次数,优化显示效率。
①创建一个静态ViewHolder 内部类(可以抽取)
②创建自定义的类 ViewHolder holder = null ;
③setTag: 在创建新的 ListView 的时候创建新的 ViewHolder 对象,然后通过 findViewById找到子控件并将其引用保存起来。而 View 中有一个方法 setTag,可用来保存一些数据结构。通过 convertView.setTag(holder)将 ViewHolder 对象的引用设置到 view 中。
④在复用 ListView 中条目的时候,再通过 convertView.getTag(holder)获取 holder对象的引用,此时我们只需要去修改其对象中子控件的值即可,不用 findViewById()
先看一下实现的一个界面:
 

Android SQLite与ListView的简单使用

文章图片

 项目结构:
Android SQLite与ListView的简单使用

文章图片

主要代码:MainPage
1 package com.hb.system.activity; 2 3 import java.util.List; 4 5 import android.annotation.SuppressLint; 6 import android.app.Activity; 7 import android.graphics.Color; 8 import android.graphics.drawable.ColorDrawable; 9 import android.os.Bundle; 10 import android.text.TextUtils; 11 import android.view.Gravity; 12 import android.view.View; 13 import android.view.View.OnClickListener; 14 import android.view.ViewGroup; 15 import android.view.animation.Animation; 16 import android.view.animation.ScaleAnimation; 17 import android.widget.AbsListView; 18 import android.widget.AbsListView.OnScrollListener; 19 import android.widget.AdapterView; 20 import android.widget.AdapterView.OnItemClickListener; 21 import android.widget.BaseAdapter; 22 import android.widget.Button; 23 import android.widget.EditText; 24 import android.widget.ImageView; 25 import android.widget.ListView; 26 import android.widget.PopupWindow; 27 import android.widget.RadioButton; 28 import android.widget.RadioGroup; 29 import android.widget.RadioGroup.OnCheckedChangeListener; 30 import android.widget.TextView; 31 import android.widget.Toast; 32 33 import com.example.studentinformationsystem.R; 34 import com.hb.bean.Student; 35 import com.hb.dao.SqlDao; 36 37 public class MainPage extends Activity implementsOnCheckedChangeListener { 38private EditText et_name; 39private Button bt_add; 40private String name; 41private RadioGroup rg_group; 42private TextView tv_showsex; 43private String showsex; 44private SqlDao dao; 45private Student stu; 46private Student stu2; 47private List< Student> list; 48private MyAdapter adapter; 49private ListView listView1; 50private PopupWindow pw; 51private TextView delete; 52 53 54 55@Override 56protected void onCreate(Bundle savedInstanceState) { 57// TODO Auto-generated method stub 58super.onCreate(savedInstanceState); 59setContentView(R.layout.mainpage); 60initView(); 61initDate(); 62 63} 64//初始化视图 65private void initView() { 66et_name=(EditText) findViewById(R.id.et_name); 67bt_add=(Button) findViewById(R.id.bt_add); 68rg_group=(RadioGroup) findViewById(R.id.rg_group); 69tv_showsex=(TextView) findViewById(R.id.tv_showsex); 70listView1=(ListView) findViewById(R.id.listView1); 71} 72//初始化数据 73private void initDate() { 74dao=new SqlDao(MainPage.this); 75list=dao.findAll(); 76adapter=new MyAdapter(); 77listView1.setAdapter(adapter); 78rg_group.setOnCheckedChangeListener(this); 79bt_add.setOnClickListener(new OnClickListener() { 80 81@Override 82public void onClick(View v) { 83name = et_name.getText().toString().trim(); 84showsex = tv_showsex.getText().toString().trim(); 85stu=new Student(name,showsex); 86 87if(TextUtils.isEmpty(name) || TextUtils.isEmpty(showsex)){ 88Toast.makeText(MainPage.this, "添加信息不能为空", Toast.LENGTH_LONG).show(); 89 90}else{ 91stu2=new Student(name); 92Student findName = dao.findName(stu2); 93if(name.equals(findName.getName())){ 94Toast.makeText(MainPage.this, "添加的姓名不能一样!", Toast.LENGTH_SHORT).show(); 95 96}else{ 97boolean add = dao.add(stu); 98if(add){ 99list=dao.findAll(); 100adapter.notifyDataSetInvalidated(); 101Toast.makeText(MainPage.this, "添加成功", Toast.LENGTH_SHORT).show(); 102}else { 103Toast.makeText(MainPage.this, "添加失败", Toast.LENGTH_SHORT).show(); 104} 105} 106} 107} 108}); 109/** 110* listview的条目点击事件 111*/ 112listView1.setOnItemClickListener(new OnItemClickListener() { 113private String na; 114 115@Override 116public void onItemClick(AdapterView< ?> parent, View view, 117final int position, long id) { 118na = list.get(position).getName(); 119View v = View.inflate(MainPage.this, R.layout.adapter_popu_window, null); 120if (pw != null) { 121pw.dismiss(); //让弹出的PopupWindow消失 122pw = null; 123} 124pw = new PopupWindow(v, -2, -2); 125int [] location=new int[2]; 126view.getLocationInWindow(location); 127pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); 128pw.showAtLocation(parent,Gravity.RIGHT+ Gravity.TOP, 20,location[1]-5 ); //设置显示的位置 129ScaleAnimation animation = new ScaleAnimation(0.3f, 1f, 0.3f, 1f, Animation.RELATIVE_TO_SELF, 130Animation.RELATIVE_TO_SELF); //弹出的动画 131animation.setDuration(400); //设置动画时间 132v.startAnimation(animation); //开启动画 133delete = (TextView)v.findViewById(R.id.tv_delete); 134/** 135* 删除每一个item上的数据 136*/ 137delete.setOnClickListener(new OnClickListener() { 138 139@Override 140public void onClick(View v) { 141dao.delete(na); 142list.remove(position); //移除item的条目 143list=dao.findAll(); //调用查询所有重新再查找一遍 144adapter.notifyDataSetChanged(); //更新适配器 145} 146}); 147} 148}); 149 150/** 151* listview的滑动监听 152* 当鼠标上下滑动的时候让PopupWindow消失 153*/ 154listView1.setOnScrollListener(new OnScrollListener() { 155 156@Override 157public void onScrollStateChanged(AbsListView view, int scrollState) { 158} 159@Override 160public void onScroll(AbsListView view, int firstVisibleItem, 161int visibleItemCount, int totalItemCount) { 162if(pw!=null){ 163pw.dismiss(); 164pw=null; 165} 166} 167}); 168} 169 170//按钮组的点击事件 171@Override 172public void onCheckedChanged(RadioGroup group, int checkedId) { 173 174//获取变更后的选中项的ID 175int radioButtonId = group.getCheckedRadioButtonId(); 176RadioButton rb = (RadioButton)MainPage.this.findViewById(radioButtonId); 177//更新文本内容,以符合选中项 178tv_showsex.setText(rb.getText()); 179} 180class MyAdapter extends BaseAdapter{ 181 182private String sex2; 183private View view; 184private String name2; 185@SuppressLint("ViewHolder") @Override 186public View getView(int position, View convertView, ViewGroup parent) { 187ViewHolder holder=null ; //设置静态类使其初始化 188if(convertView==null){ 189 190holder = new ViewHolder(); //创建holder对象 191view = View.inflate(MainPage.this, R.layout.item,null ); 192 193holder.iv_head = (ImageView) view.findViewById(R.id.iv_head); 194holder.tv_name = (TextView) view.findViewById(R.id.tv_n); 195holder.tv_sex = (TextView) view.findViewById(R.id.tv_s); 196 197view.setTag(holder); //用来保存一些数据结构。 198}else{ 199view=convertView; //复用历史缓存 200holder=(ViewHolder) view.getTag(); 201 202} 203name2 = list.get(position).getName(); 204sex2 = list.get(position).getSex(); 205if("男".equals(sex2)){//区分性别 206holder.iv_head.setImageResource(R.drawable.nan); 207}else{ 208holder.iv_head.setImageResource(R.drawable.nv); 209} 210holder.tv_name.setText(name2); 211holder.tv_sex.setText(sex2); 212return view; 213} 214@Override 215public int getCount() { 216return list.size(); //返回list集合中的数据个数 217} 218 219@Override 220public Object getItem(int position) { 221 222return null; 223} 224 225@Override 226public long getItemId(int position) { 227 228return 0; 229} 230 231 232 233} 234//ViewHolder静态类 235static class ViewHolder{ 236ImageView iv_head; 237TextView tv_name; 238TextView tv_sex; 239} 240 241 }


Student

1 package com.hb.bean; 2 3 public class Student { 4private String name; 5private String sex; 6public Student(){ 7} 8public Student(String name){ 9this.name = name; 10} 11public Student(String name, String sex) { 12super(); 13this.name = name; 14this.sex = sex; 15} 16 17public String getName() { 18return name; 19} 20public void setName(String name) { 21this.name = name; 22} 23public String getSex() { 24return sex; 25} 26public void setSex(String sex) { 27this.sex = sex; 28} 29 30 }

sqlDao
1 package com.hb.dao; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import android.content.ContentValues; 7 import android.content.Context; 8 import android.database.Cursor; 9 import android.database.sqlite.SQLiteDatabase; 10 11 import com.hb.bean.Student; 12 import com.hb.helper.OpenHelper; 13 14 public class SqlDao { 15 16private OpenHelper helper; 17public SqlDao(Context context) { 18helper=new OpenHelper(context); 19} 20/** 21* 添加 22* @param stu 23* @return 24*/ 25public boolean add(Student stu){ 26SQLiteDatabase db = helper.getWritableDatabase(); 27ContentValues values = new ContentValues(); 28values.put("name", stu.getName().toString()); 29values.put("sex", stu.getSex().toString()); 30long insert = db.insert("student", null, values); 31db.close(); 32if(insert !=-1){ 33return true; 34}else{ 35return false; 36} 37} 38/** 39* 删除 40* @param name 41*/ 42public void delete(String name){ 43SQLiteDatabase db = helper.getWritableDatabase(); 44 //db.execSQL("delete student where name =?",new String[]{name}); 45db.delete("student", "name=?", new String[]{name}); 46db.close(); 47} 48/** 49* 修改 50* @param name 51* @param newsex 52*/ 53public void update(String name, String newsex){ 54SQLiteDatabase db = helper.getWritableDatabase(); 55db.execSQL("update student set sex=? where name=?",new Object[]{name,newsex}); 56db.close(); 57} 58/** 59*查找学生姓名 60* @param stu 61* @return 62*/ 63public Student findName(Student stu2 ){ 64SQLiteDatabase db = helper.getReadableDatabase(); 65Cursor cursor = db.rawQuery("select * from student where name=?", new String[]{stu2.getName()}); 66Student s = new Student(); 67while(cursor.moveToNext()){ 68 //String name = cursor.getString(1); 69s.setName(stu2.getName()); 70} 71cursor.close(); 72db.close(); 73return s; 74} 75//查询所有学生 76public List< Student> findAll(){ 77SQLiteDatabase db = helper.getReadableDatabase(); 78List< Student> list =new ArrayList< Student> (); 79Cursor cursor = db.query("student", null, null, null, null, null, null); 80while(cursor.moveToNext()){ 81//创建学生对象 82Student s = new Student(); 83String name = cursor.getString(1); 84String sex = cursor.getString(2); 85//添加到学生bean里面 86s.setName(name); 87s.setSex(sex); 88list.add(s); 89} 90db.close(); 91cursor.close(); 92return list; 93 94} 95 }

【Android SQLite与ListView的简单使用】OpenHelper
1 package com.hb.helper; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 7 public class OpenHelper extends SQLiteOpenHelper { 8 9public OpenHelper(Context context) { 10super(context, "db.student", null, 1); 11} 12 13 14@Override 15public void onCreate(SQLiteDatabase db) { 16db.execSQL("create table student (_id integer primary key autoincrement,name varchar(20),sex varchar(3))"); 17} 18 19@Override 20public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 21 22}

    推荐阅读