Android基础知识(三)之ListView
来源:互联网 发布:java源码如何变成软件 编辑:程序博客网 时间:2024/05/20 22:29
1 ListView入门
【1】定义Listview在布局中
【2】定义ListView的数据适配器
【3】实现BaseAdapter的getCount()方法和getView()方法
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //[1]找到我们关心的控件 ListView lv = (ListView) findViewById(R.id.lv); //[2]显示数据 和其他的普通控件有点区别 数据来源于数据适配器 lv.setAdapter(new MyListAdapter()); } //定义listview的数据适配器 private class MyListAdapter extends BaseAdapter { //一共有多少条数据需要展示@Overridepublic int getCount() {return 1000000;}//返回指定position位置对应的对象@Overridepublic Object getItem(int position) {return null;}//返回position位置对应的ID@Overridepublic long getItemId(int position) {return 0;}/** * 获取一个View 用来显示listview的数据 会作为listview的一个条目出现 * convertView 历史缓存对象 */@Overridepublic View getView(int position, View convertView, ViewGroup parent) {//第一次没有优化的情况下//System.out.println("getView"+position);//TextView tv = new TextView(MainActivity.this);//tv.setText("哈哈"+position);//return tv;//TextView tv;if(convertView == null){//创建新的View对象tv = new TextView(MainActivity.this);System.out.println("创建新的View对象----"+position);}else{System.out.println("复用历史缓存对象 对象----"+position);tv = (TextView) convertView;}tv.setText("哈哈"+position);return tv;} }
2 ListView的优化
当快速滚动的时候出现错误:out of memory on a 108-byte allocation
优化方法(在getView()方法中固定写法):
TextView tv;if(convertView == null){//创建新的View对象tv = new TextView(MainActivity.this);}else{tv = (TextView) convertView; } tv.setText("哈哈哈呵呵呵"+position); return tv;补充:ListView的奇怪现象(给出总结:以后再使用ListView的时候,使用填充父窗体,即match_parent,一般宽和高都使用填充父窗体)
3 ListView显示数据的原理
javaweb中的mvc:
m:mode 数据
v :view 视图
c :controller 负责把数据展示到jsp中
Android中的mvc:
m:mode 数据(javabean)
v :view ListView
c :controller adapter:负责把数据展示到jsp中
☆不管是什么Adapter,作用就是把数据展示到ListView上
4 ListView显示复杂页面
线性布局、相对布局都继承着ViewGroup,这就说明ViewGroup可以有自己的孩子
通过一个打气筒(inflate)可以把一个布局转换成一个View对象
5 获取打气筒(inflate)的常见API
public View getView(int position, View convertView, ViewGroup parent) {//[1]想办法把我们自己定义的布局转换成一个View对象就可以了View view;if(convertView==null){//创建新的View对象 可以通过打气筒把一个布局资源转换成一个View对象//resourse就是布局文件//第一种获取打气筒方法☆☆☆☆☆☆//view = View.inflate(getApplicationContext(), R.layout.item, null);//第二种获取打气筒方法☆☆☆☆☆☆//view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);//第三种获取打气筒方法☆☆☆☆☆☆LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);view = inflater.inflate(R.layout.item, null);}else{//复用历史缓存对象view = convertView;}return view;}
6 ArrayAdapter的使用
String objects[]={"老张","老方","老黎","老毕","老刘","老韩"};//模拟数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //[1]找到我们关心的控件 ListView lv = (ListView) findViewById(R.id.iv); //[2]创建一个arrayAdapter ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.item1, R.id.tv_name, objects); //[3]设置数据适配器 lv.setAdapter(adapter);权重的概念:一般使用在线性布局中,就是把宽分成几等份,然后每个TextView占几份
7 SimpleAdapter使用
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //[1]找到我们关心的控件 ListView lv = (ListView) findViewById(R.id.lv); //[1.1]准备listview要显示的数据 List<Map<String, String>> data = new ArrayList<Map<String,String>>(); Map<String, String> map1 = new HashMap<String, String>(); map1.put("name", "张飞"); map1.put("phone", "1388888"); Map<String, String> map2 = new HashMap<String, String>(); map2.put("name", "赵云"); map2.put("phone", "110"); Map<String, String> map3 = new HashMap<String, String>(); map3.put("name", "貂蝉"); map3.put("phone", "1311187"); Map<String, String> map4 = new HashMap<String, String>(); map4.put("name", "关羽"); map4.put("phone", "15567485"); //[1.2]把map加入到集合中 data.add(map1); data.add(map2); data.add(map3); data.add(map4); //[2]设置数据适配器 resourse:我们定义的布局文件 //from:map集合的键值 SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_phone}); //[3]设置数据适配器 lv.setAdapter(adapter); }
15 把数据库里面的数据查询出来展示到ListView上
//定义listview的数据适配器 private class MyAdapter extends BaseAdapter {@Overridepublic int getCount() {return lists.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn null;}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view;if(convertView==null){//创建新的view对象view = View.inflate(getApplicationContext(), R.layout.item, null);}else{view = convertView;}//找到控件 用来显示数据TextView tv_name = (TextView) view.findViewById(R.id.tv_name);TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);//如果显示数据Person person = lists.get(position);tv_name.setText(person.getName());tv_phone.setText(person.getPhone());return view;} }
阅读全文
0 0
- Android基础知识(三)之ListView
- android基础知识复习(三)—— ListView使用
- android控件之ListView(三)
- android listview系列之自定义的适配器(三)
- 计算机网络之基础知识(三)
- Android基础知识五(ListView、OOM)
- Android中Listview(三)--圆角listview
- android中ListView基础知识
- [android基础知识] 之三:系统级service
- Android的UI组件之ListView(三)
- Android ListView详解(三)
- Android控件ListView(三)
- Android基础知识——ListView
- 运维之Linux基础知识(三)
- python学习之基础知识(三)
- Ethernet基础知识之三
- C#基础知识之三
- Android中的一些基础知识(三)
- 素材资源网站
- java-rabbitmq-官网实例06
- Rete算法
- ES6_Study
- Python编程:从入门到实践(课后习题3)
- Android基础知识(三)之ListView
- qt dateedit以日历形式显示
- java-rabbitmq-实例pull模式拉取消息
- vuex知识点
- 腾讯 AI Lab 张潼主任带你轻松 get AI 新知识(转载)
- TabLayout+PullToRefreshListView上拉刷新,下拉加载,imageloader自定义
- 【情感分析】基本流程和思路
- 动态规划介绍文章收藏
- 【技术贴收集】开源项目Html Agility Pack实现快速解析Html