ListView是android中比较常用的控件,常用于显示列表等,对于它的使用应该熟练掌握。
一、ListView的使用
1,在布局文件中声明一个ListView控件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="cn.com.cyj.Listview.MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</RelativeLayout>
2,编写要ListView每一个条目显示的控件布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="名字" />
<TextView
android:id="@+id/tv_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="号码" />
</LinearLayout>
3,在java文件中通过id获得ListView控件,并给控件设置一个adapter
package cn.com.cyj.Listview;
import java.util.List;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
private ListView listView;
String[] name = new String[] { "张三", "李四", "王五", "赵六", "陈七"};
String[] number = new int[] {"1234567890","987654312","6548415134","654897132"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.lv);
// 给listview添加适配器,用于把集合中的数据显示到listview
listView.setAdapter(new MyAdapter());
}
// 接口的默认实现类simpleXXX,BaseXXX,defaultXXX
private class MyAdapter extends BaseAdapter {
// 获得条目数
@Override
public int getCount() {
return personList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return number[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
// 因为返回view对象,通过资源ID,把指定的布局文件填充成view对象
v = View.inflate(MainActivity.this, R.layout.listview_item,null);
// findViewById(id)默认在activity_xml中查找,在其前面加view对象引用即在指定的xml文件中查找
TextView tv_name = (TextView) v.findViewById(R.id.tv_name);
TextView tv_number = (TextView) v.findViewById(R.id.tv_number);
tv_name.setText(name[position]);
tv_number.setText(number[position]);
return v;
}
}
}
这样ListView就可以使用了。
二、ListView的优化
在使用ListView时,由于加载的条目过多在滑动时会造成卡顿,因为ListView在当前屏幕显示多少个条目就会创建多少个对象,每一个条目都是一个对象,在滑动时,滑出屏幕的对象被销毁,新加载到屏幕上的条目会创建新的对象;这样,在ListView快速滑动时会不断的创建对象->销毁对象->创建对象,并且每一个条目都会加载一次布局,通过findViewById()操作初始化控件,xml文件以树形结构进行加载,每一次加载都从根节点进行初始化,对内存消耗很大,浪费时间。如果条目有图片,图片加载时间比较长,会造成内存溢出。因此,需要对ListView进行优化,优化的原理是在滑动时不会重复创建对象,减少内存消耗和屏幕渲染处理。优化步骤如下:
1,创建静态类
将需要加载的控件变量放在该静态类中,保证所有控件只创建一次对象。
static class ViewHolder{
<span style="white-space:pre"> </span>TextView tv_name;
<span style="white-space:pre"> </span>TextView tv_number;
}
2,复用convertView对象
在Adapter的getView()方法中,第二个参数convertView就是之前滑出屏幕的条目对象。如果第一次加载该方法,会创建行的View对象,如果滑动ListView,滑动出屏幕的View对象会以缓存的形式存在,convertView就是缓存的View对象,可以通过复用该缓存对象减少对象的创建。在加载布局时先判断convertView对象是否存在,如果convertView == null说明没有缓存对象,使用View.inflate()方法加载布局,进行布局初始化;否则复用缓存的View对象。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = View.inflate(ContactsActivity.this,R.layout.item_contacts, null);
holder = new ViewHolder();
holder.tv_ame = (TextView) convertView.findViewById(R.id.tv_name);
holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.tv_name.setText(name[position]);
holder.tv_number.setText(<span style="font-family: Arial, Helvetica, sans-serif;">number[position]</span>);
return convertView;
}
这样就完成了ListView的优化。