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
{
//一共有多少条数据需要展示
@Override
public int getCount() {
return 1000000;
}
//返回指定position位置对应的对象
@Override
public Object getItem(int position) {
return null;
}
//返回position位置对应的ID
@Override
public long getItemId(int position) {
return 0;
}
/**
* 获取一个View 用来显示listview的数据 会作为listview的一个条目出现
* convertView 历史缓存对象
*/
@Override
public 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
{
@Override
public int getCount() {
return lists.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) {
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;
}
}