[android] listview入门
Listview组件非常重要,4分之一的时间都是在搞这个,还是通过上一节的数据库,写个for循环,插入50条数据。
先使用笨方法显示数据,根布局LinearLayout 定义一个id,在activity里面获取这个id。
获取PersonDao对象,调用dao对象的查询全部的方法,得到一个list集合的数据。
遍历这个集合,遍历中调用person实体类对象的toString()方法,得到一条记录的字符串。
遍历中实例化TextView对象,调用TextView对象的setText()方法,把一条信息放进去。
调用LinearLayout对象的addView(child)方法,child参数就是子view对象
笨方法代码:
LinearLayout lv=(LinearLayout) findViewById(R.id.lv); PersonDao dao=new PersonDao(this); List<Person> persons=dao.select(); for(Person person:persons){ TextView tv=new TextView(this); tv.setText(person.toString()); lv.addView(tv); }
此时屏幕高度不够,超出去的信息会直接隐藏,系统给提供了一个组件叫ScrollView可以上下滚动,包裹一下LinearLayout,此时会提示命名空间那里错误,把命名空间放在SorollView里,指定宽度和高度都是填充父窗体
当数据量比较大时,这样直接new出无数对象很消耗资源,应该是在滑动过程中动态new出组件对象,超出视线就销毁掉,这个时候引入了新的控件ListView
获取ListView对象,通过findViewById()方法,调用ListView对象的setAdapter(adapter)方法设置数据绑定到ListView,参数是一个ListAdapter接口类型,我们要实现这个接口,把实现类对象传进去,定义一个私有的内部类实现ListAdapter,这时会要求实现几十个方法,太多了,系统为我们提供了一个实现类BaseAdapter,默认的实现类大部分都是以BaseXxx,SimpleXxx,DefaultXxx开头
BaseAdapter是一个抽象类,要实现他的抽象方法,内部类继承BaseAdapter实现以下方法
getCount(),返回int数据的条数,把我的数据集合定义成成员属性,调用List集合size()方法
getItem(),
getItemId()
getView(position,) 控制索引位置的View对象,position是当前集合的索引,
在这个方法中,我们可以实例化TextView对象,需要传入上下文对象,使用getApplicationContext()获取上下文,调用TextView对象的setText(),数据是List集合调用get()方法,传入索引position获得,返回那个TV对象。在这个方法中Log.i()打印日志可以看到只会生成视线范围内的View对象。
activity代码:
package com.tsh.database; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView; import com.tsh.database.dao.PersonDao; import com.tsh.database.domain.Person; public class MainActivity extends Activity { private List<Person> persons; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lv=(ListView) findViewById(R.id.mylist); PersonDao dao=new PersonDao(this); persons=dao.select(); lv.setAdapter(new MyAdapter()); } private class MyAdapter extends BaseAdapter{ @Override public int getCount() { // TODO Auto-generated method stub return persons.size(); } @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; } @Override public View getView(int position, View convertView, ViewGroup parent) { Log.i("MainActivity", "生成对象"+position); TextView tv=new TextView(getApplicationContext()); Person person=persons.get(position); tv.setText(person.toString()); return tv; } } }
相关文章
- Android平台GB28181设备接入端如何支持跨网段语音对讲?
- 基于flask和bootstrap-table的通用数据查询
- 爬虫方案 | 爬取大众点评网评论的几个思路(从小程序端)
- 【黄啊码】如何用小程序实现世界杯参赛队伍投票
- 《Android App开发进阶与项目实战》资源下载和内容勘误
- 微信小程序使用阿里巴巴的矢量图标iconfont
- 微信小程序 点击显示隐藏 极简Tab标签 点击添加class样式
- 微信小程序 wx:if 与 hidden区别
- 微信小程序 CSS border-radius元素 overflow:hidden失效问题 iPhone ios 苹果兼容问题
- 微信小程序 自定义 tabBar案例 官方案例迁入无效解决方法 非 tab 页显示 tabBar的问题解决 自定义tabBar与原生tabBar以及自写伪tabbar的区别
- IOS APPStore 上传更新应用版本 软件
- Android - NETD解读
- 【Android自定义控件】不用ScrollView实现上下两屏滑动
- Android实现TextView跑马灯效果
- Android进程间通信(一)- Bundle
- Android进程间通信(二)- Messenger
- 微信小程序实现上拉和下拉加载更多
- 微信小程序 scroll-view 完成上拉加载更多
- 微信小程序实现tabs选项卡
- java和vue学生定位打卡小程序人脸识别打卡系统源码网站学生考勤系统