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