Android_03_关于ListView的使用
来源:互联网 发布:pkzip 是什么软件 编辑:程序博客网 时间:2024/06/13 01:59
MainActivity.java
package com.itheima.showdata;import java.util.ArrayList;import java.util.List;import com.itheima.listviewshowdata.R;import com.itheima.showdata.domain.Person;import android.os.Bundle;import android.app.Activity;import android.app.ListActivity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.view.LayoutInflater;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {List<Person> personList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); personList = new ArrayList<Person>(); //把数据库的数据查询出来 MyOpenHelper oh = new MyOpenHelper(this); SQLiteDatabase db = oh.getWritableDatabase(); Cursor cursor = db.query("person", null, null, null, null, null, null, null); while(cursor.moveToNext()){ String _id = cursor.getString(0); String name = cursor.getString(1); String salary = cursor.getString(2); String phone = cursor.getString(3); Person p = new Person(_id, name, phone, salary); personList.add(p); } //获取activity_main.xml中的ListView组件 ListView lv = (ListView) findViewById(R.id.lv); //setAdapter()是设置ListView要显示的内容 //其参数ListAdapter是接口,需要实现的方法比较多, 所以,我们就用其下的 //一个实现类BaseAdapter代替ListAdapter,这样我们需要重写的方法就少一些 lv.setAdapter(new MyAdapter()); } // class MyAdapter extends BaseAdapter{ //系统调用,用来获知集合中有多少条元素@Overridepublic int getCount() {return personList.size();}//由系统调用,获取一个View对象,作为ListView的条目//position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//position是从0开始,在listView中是处于第几个条目那么position的值就是多少Person p = personList.get(position); //方法一:直接new一个TextView,返回,但是其显示的布局不够美观和灵活;//由于在TextView中直接this,那么指的就是MyAdapter的对象,所以需要写成MainActivity.this//MainActivity.this表示MainActivity的一个对象/*TextView tv = new TextView(MainActivity.this);System.out.println("getView调用:" + position + ";" + convertView);tv.setText(p.toString());tv.setTextSize(18);*///方法二,三,四都是使用布局文件转化成一个View对象;跟踪其源码,其实属于同一种方法;//方法二:View v = null;//由于View.inflate()是非常耗费资源的,所以在这里我们需要利用convertView的缓存//判断条目是否有缓存if(convertView == null){//把布局文件填充成一个View对象//inflate是View里边的一个静态方法;表示:Inflate a view from an XML resource.v = View.inflate(MainActivity.this, R.layout.item_listview, null);}else{v = convertView;}//方法三://获取布局填充器对象//LayoutInflater inflater = LayoutInflater.from(MainActivity.this);//使用布局填充器填充布局文件//View v2 = inflater.inflate(R.layout.item_listview, null);//方法四://LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);//View v3 = inflater2.inflate(R.layout.item_listview, null);//通过资源id查找组件,注意调用的是View对象的findViewById//若在findViewById(R.id.tv_name)前不加v. 那么调用的则是activity_main.xml//因为findViewById是activity类的一个方法,通过查看findViewById方法可知://Finds a view that was identified by the id attribute from the XML //that was processed in onCreate(Bundle).//所以其调用就是:activity_main.xml ;而我们在这里实际需要调用的是item_listview.xml,//而activity_main.xml已经封装进v对象,所以需要写成v. 指明调用的是item_listview.xml文件中的TextViewTextView tv_name = (TextView) v.findViewById(R.id.tv_name);tv_name.setText(p.getName());TextView tv_phone = (TextView) v.findViewById(R.id.tv_phone);tv_phone.setText(p.getPhone());TextView tv_salary = (TextView) v.findViewById(R.id.tv_salary);tv_salary.setText(p.getSalary());return v;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;} } }
package com.itheima.showdata;import java.sql.ResultSet;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {super(context, "people.db", null, 1);// TODO Auto-generated constructor stub}//数据库创建时,此方法会调用@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("create table person(_id integer primary key autoincrement, name char(10), salary char(20), phone integer(20))");}//数据库升级时,此方法会调用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {System.out.println("数据库升级了");}}
TestCase.java
package com.itheima.sqlitedatabase.test;import com.itheima.showdata.MyOpenHelper;import android.content.ContentValues;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;public class TestCase extends AndroidTestCase {private MyOpenHelper oh;private SQLiteDatabase db;//测试框架初始化完毕之后,在测试方法执行之前,此方法调用@Overrideprotected void setUp() throws Exception {super.setUp();oh = new MyOpenHelper(getContext());db = oh.getWritableDatabase();}//测试方法执行完毕之后,此方法调用@Overrideprotected void tearDown() throws Exception {// TODO Auto-generated method stubsuper.tearDown();db.close();}public void insertApi(){//把要插入的数据全部封装至ContentValues对象for (int i = 0; i < 50; i++) {ContentValues values = new ContentValues();values.put("name", "赵"+i);values.put("phone", "159"+i+i);values.put("salary", "160"+i+i);db.insert("person", null, values);}}}
person.java
package com.itheima.showdata.domain;public class Person {private String _id;private String name;private String phone;private String salary;public String get_id() {return _id;}public void set_id(String _id) {this._id = _id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public String getSalary() {return salary;}public void setSalary(String salary) {this.salary = salary;}@Overridepublic String toString() {return name + ", " + phone + ", " + salary;}public Person(String _id, String name, String phone, String salary) {super();this._id = _id;this.name = name;this.phone = phone;this.salary = salary;}}
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" ></ListView></LinearLayout>
item_listview.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- RelativeLayout等几种布局,其都是通过实现ViewGroup抽象类而来的; 通过查看API可知:ViewGroup与其他View组件不同之处在于,在xml文件中, 其可以包含其他View对象的子节点,而一般的View对象是不可以有子节点的; --> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="名字" android:textSize="25sp" /><LinearLayout android:layout_alignParentRight="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="号码" /> <TextView android:id="@+id/tv_salary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="工资" /></LinearLayout></RelativeLayout>
注:总结一下整体思路
1>
先利用TestCase.java单元测试框架创建并填充数据进数据库
2>
在MainActivity.java文件中,获取数据库的数据,并存进personList中
3>
在MainActivity.java文件中,得到ListView,并通过setAdapter()设置ListView要显示的内容
4>
通过setAdapter()传进的参数ListAdapter中的view()方法返回一个view对象,从而是这个view对象显示在ListView上
附加知识点:
1>
只有当ListView的子控件不使能获得焦点时,listview条目的侦听才有效;
2>
setSelection (int position):
当listView有很多条目时,可用来设置listView,让listView来决定当前界面第一个显示的条目是哪个;
其中,position的值可以取为ListView所有条目中某一个条目的索引值,当取值为负数时,则用0来替代;
setSelectionFromTop (int position, int y):
相比setSelection (int position)而言,其可以更精准的进行定位;其除了包含setSelection (int position)
所具备的功能之外,其还能让被选中的条目(即将显示在界面的头个条目)停留在界面的具体什么位置,
换句话说,就是让被选中的条目距离显示界面的顶部多少的距离比如,让选中的条目只显示一半或者三分之一等;
只让选中的条目显示一半,三分之一或者显示更多的距离可以通过设置y参数来达到目的;y的参数值的意义,
是在选中的条目的基础上来进行移动的;
3>
关于listView的刷新,可以通过listView所设置的适配器中的方法:notifyDataSetChanged()来达到刷新的目的;
- Android_03_关于ListView的使用
- Android_03_数据库的使用总结
- 关于ListView的使用
- 关于listview的使用
- 关于ListView的初步使用
- Android关于ListView的总结--使用ListActivity
- Android关于ListView的总结--使用ListActivity
- 在Android中关于ListView的使用
- 关于使用listView应该注意的地方
- 关于ListView使用ViewHolder
- 关于listview使用ArrayAdapter实现adapter定制的使用
- 关于ListView的用法
- 关于Android的ListView
- 关于ListView的注意事项
- 关于listview的优化
- 关于ListView的HeaderView
- 关于listview的帖子
- 关于ListView的若干问题
- php开发中的10大良好习惯
- Unix学习笔记-----对于守护进程的一些理解
- 符号三角形问题
- c语言调用c++类成员函数的方法
- 高性能、高并发TCP服务器(多线程调用libevent)
- Android_03_关于ListView的使用
- java中的多线程
- 20151015查找水仙花数
- [LeetCode]Happy Number
- js转义字符串
- Linux信号实践(5) --时间与定时器
- Linux内核-内存管理-内存访问与缺页中断
- 关于anaconda分析的第二篇
- iOS开发008 无限循环自动图片轮播器