ListView是Android中使用最频繁的控件之一,Android对ListView做了特殊的优化。如果数据量很大的时候,这种优化将非常重要,能够顺滑滚动,提高用户体验。
首先我们使用BaseAdapter创建我们自定义的adapter,复写方法,其中的getview方法尤其很重要。
优化包括使用以下两个部分:
1.复用convertView
2.使用ViewHolder
具体的代码实现:
public class MainActivity extends Activity {
private List<Map<String,Object>> listItems;
private ListView listView;
String[] header={"姓名","性别","电话","住址"};
String[] content={"张三","男","18850201111","中南海"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listItems=new ArrayList<Map<String,Object>>();
listItems=getListItems();//获取数据
listView=(ListView) findViewById(R.id.listview);
MyBaseAdapter adapter=new MyBaseAdapter(this);
listView.setAdapter(adapter);
}
/************************获取listitem的数据********************************/
private List<Map<String, Object>> getListItems()
{
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map;
for(int i=0;i<header.length;i++)
{
map = new HashMap<String, Object>();
map.put("header", header[i]);
map.put("content", content[i]);
list.add(map);
}
return list;
}
/***************创建一个静态的ViewHolder,用来保存listItem里的控件****************************/
static class ViewHolder
{
public TextView title;
public TextView info;
}
public class MyBaseAdapter extends BaseAdapter {
private LayoutInflater inflater;
//private List<Map<String, Object>> data;
/**************构造方法获取上下文********************************/
private MyBaseAdapter(Context context){
this.inflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listItems.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return listItems.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder=null;
if(convertView==null){
holder=new ViewHolder();//如果缓存view不存在,则创建一个新的ViewHolder
convertView=inflater.inflate(R.layout.task_item, null);
holder.title=(TextView) convertView.findViewById(R.id.nameheader);
holder.info=(TextView) convertView.findViewById(R.id.content);
convertView.setTag(holder);
}
else
holder=(ViewHolder) convertView.getTag();
/*********以下设置控件显示内容***********/
holder.title.setText((String) listItems.get(position).get("header"));
holder.info.setText((String) listItems.get(position).get("content"));
return convertView;
}
}
}