Android(安卓)数据显示在屏幕上
1、将数据库中查询的数据显示在屏幕上:
textview 是可以new出来的。
可以将集合中封装的对象信息 每一个对象对应一个TextView,将对象的信息设置到TextView中的文本信息框中。
LinearLayout ll = (LinearLayout) findViewById(R.id.ll); for (Person p : personList) { //每一个对象对应一个TextView TextView tv = new TextView(this); //将人物的信息 設置到文本框中。 tv.setText(p.toString()); tv.setTextSize(18);//设置字体大小这里不带sp 参数是整型 api里面已经带过单位了。 //把TextView设置为线性布局的子节点为了显示到屏幕上。 ll.addView(tv); //addview 就是将textView设置为linearlayout 的子节点。 }
linearlayout 布局中的数据是不能滑动的要想得到滑动的效果可以在linearlayout上加一个scrollview节点
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"//这个只能放在根节点下 xmlns:tools="http://schemas.android.com/tools" //这个只能放在根节点下 android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <LinearLayout android:id="@+id/ll" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > LinearLayout>ScrollView>
从数据库中将查询到的数据显示在屏幕上的全部代码:
思路:先将每一条记录 看成一个Person对象封装到javabean中方便对于数据的管理 将person对象放入到集合中。
2、每个Person 对象对应一个textView (用于在页面上显示对象的信息)
3、用Linearlayout 对象将textView 添加为其子节点 addView(); //把TextView设置为线性布局的子节点为了显示到屏幕上。 ll.addView(tv);
package com.zh.sqlitedatabase;import com.zh.showdata.MyOpenHelper;import android.app.DownloadManager.Query;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.test.AndroidTestCase;//这是在测试框架下创建数据库。public class TestCase extends AndroidTestCase { private MyOpenHelper oh; private SQLiteDatabase db; public void test() { MyOpenHelper oh = new MyOpenHelper(getContext()); // 如果数据库不存在就创建数据库,并获取可读可写的数据库对象,如果数据库存在就直接打开数据库。 SQLiteDatabase db = oh.getWritableDatabase(); } // 测试框架执行完毕,测试方法执行之前进行调用。 protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); oh = new MyOpenHelper(getContext()); db = oh.getWritableDatabase(); } // 摧毁 此方法是在方法执行完毕后才调用 protected void tearDown() throws Exception { // TODO Auto-generated method stub super.tearDown(); db.close(); } public void insert() { for(int i =0; i<50;i++){ ContentValues values = new ContentValues(); values.put("name", "赵"+i); values.put("salary","160"+i+i); values.put("phone","139"+i); db.insert("person", null, values); } } } package com.zh.showdata.domain;public class Person { //封装数据 private String _id; private String name; private String salary; private String phone; @Override public String toString() { return name + ";"+salary +";"+phone; } 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 getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } //构造函数方便 创建对象 public Person(String _id, String name, String salary, String phone) { super(); this._id = _id; this.name = name; this.salary = salary; this.phone = phone; }}package com.zh.showdata;import java.util.ArrayList;import java.util.List;import com.zh.showdata.domain.Person;import android.app.Activity;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends Activity { List personList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); personList = new ArrayList(); //创建person对象的list集合 用于封装person对象。 // 把数据库中的数据读取出来 MyOpenHelper oh = new MyOpenHelper(this); SQLiteDatabase db = oh.getWritableDatabase(); Cursor cursor = db.query("person", null, null, null, null, null, null, "10,10"); //这里面有个分页条件 第十条开始 显示10条记录。 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, salary, phone); personList.add(p); // 将查询到的人放到Arraylist集合当中。 } LinearLayout ll = (LinearLayout) findViewById(R.id.ll); for (Person p : personList) { TextView tv = new TextView(this); //将人物的信息 設置到文本框中。 tv.setText(p.toString()); tv.setTextSize(18); //把TextView设置为线性布局的子节点为了显示到屏幕上。 ll.addView(tv); } }}
以上方法做列表形式的屏幕显示过于繁杂没有效率。
对于大量数据时数据对象的封装循环,和每个对象对应每个TextView循环占用内存会很大,有内存溢出的可能性。
limit 分页时设置条件 “10,10” 第一个数据表示的是从第10行数据开始显示,第二个数据表示显示10条数据。
专门用来显示列表的视图 listview 列表视图实际开发运用很常见。
(它实现了屏幕上消失和加载新的数据的算法保证屏幕显示的记录数)
ListView 列表视图组件:
默认每行有一条Item 就是一条条目。
<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" android:orientation="vertical" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent" > ListView>LinearLayout>
ListView 对比javaWeb中的三层架构。
MVC架构
* M:模型层 —- javaBean —- personList 用户要查看的内容
* V:视图层 —- jsp —- ListView 将模型层中的内容显示在上面 (用户直接看到的是ListView)
* C:控制层 —- servlet —- Adapter 充当控制层,控制personList里面的内容显示在ListView
Adapter
* ListView的每个条目都是一个View对象
* Ctrl+T eclipse下查看该类的所有父类和子类
Adapter 适配器 是个接口需要实现的方法很多,这种情况下查看其子类 常用 base default XXX;
ListView的每个条目都是一个View对象 View对象包括TextView EditView Button …… 只要是View对象都可以显示ListView的条目中。
用ListView将数据显示在屏幕上:
1、
ListView lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new MyAdapter());
BaseAdapter是一个抽象类 定义一个内部类继承其并复写其方法:
// 定义一个内部类继承BaseAdapter //抽象类 class MyAdapter extends BaseAdapter { // 由系统调来调取 获取集合中有多少元素。 @Override public int getCount() { // TODO Auto-generated method stub return personList.size(); //注意不能随便添加数据 系统运行会报错。 } // 有系统调用返回一个View对象。ListView每一个条目就是一个View对象。 该方法返回一个View对象。 @Override // position 表示每一条条目的位置。 public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub TextView tv = new TextView(MainActivity.this); Person p= personList.get(position) //这里position 是调用集合中对象在集合中的位置。跟参数刚好一致从第零个位置开始. tv.setText(p.toString()); tv.setTextSize(18); return tv; } //最后两个方法不用管它就行 @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; }
封装Person对象并从数据库中查询数据;
public class MainActivity extends Activity { List personList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); personList = new ArrayList(); // 把数据库中的数据读取出来 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(cursor.getColumnIndex("_id")); String name = cursor.getString(1); String salary = cursor.getString(2); String phone = cursor.getString(3); System.out.println(name + salary + phone); Person p = new Person(_id, name, salary, phone); personList.add(p); // 将查询到的人放到Arraylist集合当中。 } ListView lv = (ListView) findViewById(R.id.lv); lv.setAdapter(new MyAdapter()); }
将布局文件填充一个View对象:
ViewGroup 可以有子节点 比如五大布局
View v= View.inflate(MainActivity.this, resource, root);
不同的布局文件可以出现相同应用资源id,区别资源id引用的id的方法:
setContentView(R.layout.activity_main); //设置的显示内容的资源引用id 就在activity_main 布局文件当中
//把布局文件填充成有个View对象
View v= View.inflate(MainActivity.this, resource, root);
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Person p = personList.get(position); //将布局文件填充一个View对象; //这个是布局文件的引用资源id View v = View.inflate(MainActivity.this, R.layout.listview_layout, null); TextView tv_name = (TextView) v.findViewById(R.id.name); tv_name.setText(p.getName()); TextView tv_gz = (TextView) v.findViewById(R.id.gz); tv_gz.setText(p.getSalary()); TextView tv_phone = (TextView) v.findViewById(R.id.phone); tv_phone.setText(p.getPhone()); return v; }
另一种方法是布局填充器:
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// inflater.inflate(resource, root)
inflater.inflate(R.layout.listview_layout, null); //使用布局文件填充器填充布局文件 得到View对象
LayoutInflater inflater = LayoutInflater.from(MainActivity.this); View view2 = inflater.inflate(R.layout.listview_layout, null);LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); View view3= inflater3.inflate(R.layout.listview_layout, null);
布局文件:
listview_layout 布局文件
<?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" > <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="名字" android:textSize="22sp" /> <TextView android:id="@+id/gz" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="薪资" android:textSize="12sp" /> <TextView android:id="@+id/phone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:text="电话" android:textSize="12sp" android:layout_below="@id/gz" android:layout_alignRight="@id/gz" android:layout_alignLeft="@+id/gz" />RelativeLayout>
利用缓存优化ListView ;
convertView 缓存视图
public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub Person p = personList.get(position); //这个地方的位置对象 ListView 显示的条目对应,保证后面缓存出现后对文本框赋值的正确性。 // 将布局文件填充一个View对象; View v; if(convertView==null){ v = View.inflate(MainActivity.this, R.layout.listview_layout, null); } else{ v=convertView; //注意在这里对ListView缓存的优化相当有必要 View对象存在就用缓存 对于内存方面减少了不小的压力。 } TextView tv_name = (TextView) v.findViewById(R.id.name); tv_name.setText(p.getName()); TextView tv_gz = (TextView) v.findViewById(R.id.gz); tv_gz.setText(p.getSalary()); TextView tv_phone = (TextView) v.findViewById(R.id.phone); tv_phone.setText(p.getPhone()); return v; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } }}
Adapter:
ArrayAdapter 数组适配器只能接收一种数据类型: //objects 是个数组 要显示的数据内容
ArrayAdapter adpater = new ArrayAdapter(context, resource, textViewResourceId, objects)
布局layout 文件:
<?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="wrap_content" android:orientation="horizontal" > <ImageView android:layout_width="40dp" android:layout_height="40dp" android:src="@drawable/photo" /> <TextView android:layout_gravity="center_vertical" //水平方向 竖直居中可以执行 android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="名字" android:textSize="22sp" />LinearLayout>
用simpleadapter 控制模型层中的数据在listView组件视图中显示。
SimpleAdapter
SimpleAdapter sa= new SimpleAdapter(context, data, resource, from, to)
ListView lv= (ListView)findViewByid(R.id.lv);List
更多相关文章
- Android(安卓)Studio “Cannot resolve symbol” 解决办法
- Android源码分析-全面理解Context
- 动态设置布局属性
- Android(安卓)Support Design 中 CoordinatorLayout 与 Behavior
- Android(安卓)自定义流式布局
- android监听虚拟键盘隐藏和显示事件
- Android(安卓)-- 再来一发Json
- 第一章:第一行android代码注解(4)
- Android(安卓)4.4 Kitkat Phone工作流程浅析(六)__InCallActivit