Android中的ListView

  • ListView的基础
  • 简介
  • 优化
  • 注意事项
  • ListView的进阶
  • xml文件转换为view对象的方法
  • ArrayAdapter(数组适配器)
  • SimpleAdapter(简单适配器)



之前的项目虽然有使用到ListView,但是具体却没有去学习ListView,今天就开始具体学习一下ListView,所以现在做总结。

ListView的基础

简介

ListView:以滚动的方式展示条目的控件,和listAdapter(适配器)一起使用。listAdapter:适配器,为ListView提供数据。ListView监听后需使用setAdapter()方法。
适配器需要继承BaseAdapter,继承后类的方法分别有:

getCount()     //决定当前的ListView要展示多少条数据
getItem(int position)       //
getItemId(int position)       //
getView(int position, View convertView, ViewGroup parent)       //设置listView子条目的内容

优化

当ListView的条目过多,滑动太快时,java虚拟机的垃圾回收速度比ListView创建的速度要慢很多,所以会发生内存溢出的错误。
解决办法:重复使用子布局中的控件,只创建适合屏幕用量的控件。判断convertView是否为空,如果为空则创建新控件,如果不为空则重用。例:

...
@Override      
public View getView(final int position, View convertView, ViewGroup parent){  
	TextView tv = null;  
	if(convertView == null){
		tv = new TextView(MainActivity.this);
	}else{
		tv = (TextView)convertView;
	}
	tv.setText("我是第" + position + "个条目");
}
...

快速滚动的ListView属性:

android:fastScrollEnabled = "true"

注意事项

使用ListView的时候,ListView的宽高度最好不要使用包裹内容(wrap_content),否则getView方法会被加载很多次导致程序出问题,因为在加载内容时它会自己计算适合使用的宽高度。

ListView的进阶

使用xml文件将布局写好,然后使用inflate(context, resource, root)方法将xml转换为view对象,显示布局,再从数据库中获取内容显示。
例:

...
@Override      
public View getView(final int position, View convertView, ViewGroup parent){  
	View view = null;  
	if(convertView == null){
		//第一个为上下文
		//第二个为条目布局的资源id
		//第三个为ViewGroup(例:LinearLayout,RelativeLayout),如果ViewGroup传入第一个具体的对象,那么这个方法创建出来的view对象就会作为这个ViewGroup的一个childView
		view = View.inflate(MainActivity.this, R.layout.item, null);
	}else{
		view = convertView;
	}
	return view;
}
...

xml文件转换为view对象的方法

//第一种:
View.inflate(context, resource, root);
//第二种:
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
//第三种:
inflater = getLayoutInflater();
inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.item, null);

ArrayAdapter(数组适配器)

如果展示内容比较简单的话则使用ArrayAdapter,例:

//在Activity文件中的onCreate方法中写这些代码
ListView list = (ListView) findViewById(R.id.lv_list);
String[] objects = {"张三", "李四", "王五", "赵六", "凤七"}
//第一个为上下文
//第二个为条目布局的资源id
//第三个为需要显示的内容数组
ArrayAdapter adapter = new ArrayAdapter<String>(this, R.layout.item, objects);
//第一个为上下文
//第二个为条目布局的资源id
//第三个为需要修改内容的控件id
//第四个为需要显示的内容数组
adapter = new ArrayAdapter<String>(this, R.layout.item2, R.id.tv_text, objects);
list.setAdapter(adapter);

SimpleAdapter(简单适配器)

//在Activity文件中的onCreate方法中写这些代码
ListView list = (ListView) findViewById(R.id.lv_list);
List<Map<String, String>> data = new ArrayList<Map<String, String>>();
String[] from = {"title", "content"}
Map<String, String> item1 = new HashMap<String, String>();
item1.put("title", "测试title111111111111");
item1.put("content", "测试content111111111111");
data.add(item1);
Map<String, String> item2 = new HashMap<String, String>();
item2.put("title", "测试title2222222222222");
item2.put("content", "测试content222222222222");
data.add(item2);
int[] to = new int[]{R.id.tv_title, R.id.tv_content};
SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.item, from, to);
list.setAdapter(adapter);