• 把数据库内容显示到界面
  1. 清单文件设置为线性布局(5大布局属于ViewGroup)
  2. 在清单文件中可以增加View显示

LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
for(Person p : people){
//创建TextView,每条数据用一个文本框显示
TextView tv = new TextView(this);
tv.setText(p.toString());
//把文本框设置为ll的子节点
ll.addView(tv);

  • 把数据库内容显示到ListView
  1. MVC结构
    * M:model模型层,要显示的数据 ————people集合
    * V:view视图层,用户看到的界面 ————ListView
    * c:control控制层,操作数据如何显示 ————adapter对象

  2. ListView界面显示的内容为getview动态调用内容,滚动消失的内容自动销毁
  3. 每一个条目都是一个View对象
  4. 实现BaseAdapter接口,必须实现的两个方法

    第一个

    //系统调用此方法,用来获知模型层有多少条数据
    @Override
    public int getCount() {
    return people.size();
    }

    第二个

    //系统调用此方法,获取要显示至ListView的View对象
    //position:是return的View对象所对应的数据在集合中的位置
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    System.out.println("getView方法调用" + position);
    TextView tv = new TextView(MainActivity.this);
    //拿到集合中的元素
    Person p = people.get(position);
    tv.setText(p.toString());

    //把TextView的对象返回出去,它会变成ListView的条目
    return tv;
    }

  5. 屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕

  6. 缓存
     当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,传入任意一个条目的缓存

  7.  只要内存中有条目缓存,在新的条目出现时,就会使用缓存

-------------------------------------------------------------------------------------------

<?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/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:textSize="25sp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_alignParentRight="true"
>
<TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="phone"
/>
<TextView
android:id="@+id/tv_salary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="salary"
/>
</LinearLayout>
</RelativeLayout>

---------------------------------------------------------------------------------------------

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);

while(cursor.moveToNext()){
String name = cursor.getString(1);
String phone = cursor.getString(2);
int salary = cursor.getInt(3);

Person p = new Person(name, phone, salary);
personList.add(p);
}

ListView lv= (ListView) findViewById(R.id.lv);
lv.setAdapter(new MyAdapter());
}

class MyAdapter extends BaseAdapter{

//系统调用,用来获知多少条数据
@Override
public int getCount() {
return personList.size();
}

//系统调用,返回的View对象作为ListView的一个条目显示,调用的次数为getCount()的返回值

//convertView 系统之前缓存的条目,界面能显示多条条目,就会缓存多少条,而不是将所有条目都缓存,比如总共查出1000条记录但界面能够显示20条,则缓存20条
@Override
public View getView(int position, View convertView, ViewGroup parent) {

Person p= personList.get(position);

// TextView tv= new TextView(MainActivity.this);
// tv.setText(p.toString());
// tv.setTextSize(15);
//把布局文件填充成view对象

View view = null;
if(convertView ==null)
{
//把布局文件填充成view对象
view = View.inflate(MainActivity.this, R.layout.item_view, null);

//不能在此设置TextView tv_name= (TextView) view.findViewById(R.id.tv_name) 等值,否则相同的记录重复出现, 

//因为只要内存中有条目缓存,在新的条目出现时,就会使用缓存,所以每次要重新设置条目的值

}
else{
view = convertView;
}

//获取布局填充器另外一种方法
// LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
// View view = inflater.inflate(R.layout.item_view, null);

//获取布局填充器另外一种方法
// LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
// View view = inflater.inflate(R.layout.item_view, null);

//findViewById默认在setContentView(R.layout.activity_main)布局文件中找
//如果资源不在setContentView设置的布局文件中可以通过view.findViewById来找
TextView tv_name= (TextView) view.findViewById(R.id.tv_name);
TextView tv_phone= (TextView) view.findViewById(R.id.tv_phone);
TextView tv_salary= (TextView) view.findViewById(R.id.tv_salary);

tv_name.setText(p.getName());
tv_phone.setText(p.getPhone());
tv_salary.setText(p.getSalary() + "");
return view;
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}
}
}

----------------------------------------------------------------------------------------------

  • ArrayAdapter(封装好的adapter,无需实现接口方法)

------------------------------------------------------------------------------------------------

item_listview.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="wrap_content"
android:orientation="horizontal">

<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@drawable/photo1"
/>
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"
android:textSize="30sp"
android:layout_gravity="center_vertical"
/>

</LinearLayout>

------------------------------------------------------------------------------------------------

String[] objects = new String[]{
"张三",
"李斯",
"王婆"
};
ListView lv = (ListView) findViewById(R.id.lv);
lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, //指定作为条目的布局文件
R.id.tv, //指定文本显示在那个文本框
objects));
}

  • SimpleAdapter(封装好的adapter,无需实现接口方法)

---------------------

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

String[] objects = new String[]{
"张三",
"李斯",
"王婆"
};
ListView lv = (ListView) findViewById(R.id.lv);
// lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, //指定作为条目的布局文件
// R.id.tv, //指定文本显示在那个文本框
// objects));

//把每个条目需要处理的所有数据封装至MAP中,再把map封装至list中,
//这样就保证了list每个元素都包含了一个条目需要的所有数据
List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
Map<String, Object> map1 = new HashMap<String, Object>();
map1.put("name", "张三");
map1.put("photo", R.drawable.photo1);
data.add(map1);

Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("name", "张四");
map2.put("photo", R.drawable.photo1);
data.add(map2);

Map<String, Object> map3 = new HashMap<String, Object>();
map3.put("name", "张五");
map3.put("photo", R.drawable.photo1);
data.add(map3);

lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview,
new String[]{"name","photo"}, //存放键的数组
new int[]{R.id.tv,R.id.iv}));//跟键对应的资源
}

android 学习随笔五(界面)的更多相关文章

  1. 六、Android学习第五天——Handler的使用(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 六.Android学习第五天——Handler的使用 注意:有很多功能是不 ...

  2. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  3. 【Android】完善Android学习(五:API 3.2)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  4. android 学习随笔十五(Activity的生命周期与摧毁时返回数据 )

    1.Activity的生命周期 onCreate:创建时调用 onStart:在屏幕上可见,但是还没有获得焦点 onResume:可见并且获得焦点 onPause:可见,但是失去焦点 onStop:不 ...

  5. android 项目学习随笔五(JSON解析)

    1.利用Xutils获取网络数据 /** * 从服务器获取数据 需要权限: <uses-permission * android:name="android.permission.IN ...

  6. android 学习随笔二十五(动画:补间动画)

    补间动画(TweenAnimation) * 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画(为了让对象从初始状态向结束状态改变的过程更加自然而自动生成的动画效果)* 位移.旋转.缩放.透 ...

  7. android 学习随笔二十二(小结)

    ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...

  8. android 学习随笔六(网络要求及配置)

    android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程   只有主线程才能修改UI ANR异常:Applicat ...

  9. android 学习随笔二十三(动画:Fragment )

    Fragment * 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 * 在一个Activity中切换多个界面,每个界面就是一个Fragment* Fragmnen ...

随机推荐

  1. 使用TortoiseGit将代码上传到bitbucket

    首先需要有一个bitbucket的账户,这是无疑问的. 比如我本地有一个项目,项目名是 我想把这个项目托管到bitbucket上! 1.首先在bitbucket上创建一个仓库,注意仓库的名字要和项目的 ...

  2. iOS:GPUImage强大的图像处理框架

    GPUImage是一个非常棒的图像处理的开源库,里面提供了非常非常多的滤镜效果来加工图像. 不过就是因为太多效果了,而且对于程序员来说,那么多效果并不清楚知道要用那一个.于是我就使用提供的默认值,加上 ...

  3. cat 命令(转)

    cat命令的用途是连接文件或标准输入并打印.这个命令常用来显示文件内容,或者将几个文件连接起来显示,或者从标准输入读取内容并显示,它常与重定向符号配合使用. 1.命令格式: cat [选项] [文件] ...

  4. 微信支付开发(3) JS API支付

    由于微信支付接口更新,本文档已过期,请查看新版微信支付教程.地址 http://www.cnblogs.com/txw1958/category/624506.html 本文介绍如何使用JS API支 ...

  5. Android ExpandableListView的下拉刷新实现

    该控件的修改时根据PullToRefreshList的机制修改 下面是对ExpandableListView的扩展 package com.up91.gwy.view.componet; import ...

  6. mysql运行参数详解

    1, 查看MySQL服务器配置信息 mysql> show variables; 2, 查看MySQL服务器运行的各种状态值 mysql> show global status; 3, 慢 ...

  7. [BS-11] 关于RGB/ARGB颜色相关知识

    关于RGB/ARGB颜色相关知识 众所周知,自然界的颜色都是由红色R.绿色G.蓝色B三元色按不同比例混合而成,每种元色取值范围是0-255.iOS中图片的颜色分为2种:24位和32位. 1. 24位( ...

  8. Power-BI免费版常用功能之同比、环比

    Power-BI免费版也可以实现同比.环比的功能.要实现同比.环比的功能,要在筛选行添加年份.月的筛选,并且指定某年份.月份.场景:如图想要在简表中显示上年收入.收入同比.收入同比差值.上月收入.收入 ...

  9. 滑动关闭activity

    // 手指上下滑动时的最小速度 private static final int YSPEED_MIN = 1000; // 手指向右滑动时的最小距离 private static final int ...

  10. android自动填写短信验证码

    广播类 package com.examp.azuoyoutong.listner; import java.util.regex.Matcher;import java.util.regex.Pat ...