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