在Android开发中我们经常使用ListView,GridView进行显示数据,当需要绑定的数据量非常膨大时,数据的显示方式、优化显得格外重要了,庆幸的时,ListView GridView的数据适配器BaseAdaapter 或者是SimpleAdapter(BaseAdapter是一个基类,没有实现绑定数据的功能,SimpleAdapter实现了基本控件的绑定,如TextView,Button,ImageView).已经为我们实现好了数据优化工作,这些适配器使用相同组件动态绑定数据的方式进行优化,基本思想是:当数据项比较大,如数据项的条数大于一个屏幕所显示的条数时,adapter使用组件实例固定化,也就是一个屏幕可以显示几条数据,就在getView()中实例化几个convertView,当用户滚动屏幕时,convertView是共用之前的,只是数据项被重新赋值了。为了详细了解getView的工作过程,我在此写了一段能够详细描述优化过程的代码,供大家学习参考,希望对大家有帮助。
JAVA代码如下:
- ListView lstView = null;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.viewtest);
- lstView = (ListView) this.findViewById(R.id.listView1);
- ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
- for (int i = 0; i < 13; i++) {
- HashMap<String, String> hashMap = new HashMap<String, String>();
- hashMap.put("n", "");
- list.add(hashMap);
- }
- MySimpleAdapter adapter = new MySimpleAdapter(this, list);
- lstView.setAdapter(adapter);
- }
- public class ViewHolder {
- public Button btn;
- }
- private class MySimpleAdapter extends BaseAdapter {
- ArrayList<HashMap<String, String>> mData;
- LayoutInflater inflater = null;
- public MySimpleAdapter(Context context,
- ArrayList<HashMap<String, String>> data) {
- mData = data;
- inflater = LayoutInflater.from(context);
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return mData.size();
- }
- @Override
- public Object getItem(int position) {
- // TODO Auto-generated method stub
- return mData.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) {
- /*
- * ViewHolder vh; if(convertView==null){
- * convertView=inflater.inflate(R.layout.listview_item, null);
- * vh=new ViewHolder(); vh.btn=(Button)
- * convertView.findViewById(R.id.button1); convertView.setTag(vh); }
- * else{ vh=(ViewHolder) convertView.getTag(); }
- *
- *
- * vh.btn.setText(mData.get(position).get("n").toString());
- * mData.get(position).put("n",
- * mData.get(position).get("n")+" "+position); return convertView;
- */
- if (convertView == null) {
- convertView = inflater.inflate(R.layout.listview_item, null);
- convertView.setTag("tag:" + position +" ");//此标记标记 一个listview中,哪些项是新new的,如果不是新new 的convertView,则些convertview的Tag就是之前标记的
- }
- ((Button) convertView.findViewById(R.id.button1))
- .setText(convertView.getTag().toString() + " "
- + mData.get(position).get("n").toString()); //些语句将listview 的每项的tag都标注上,用于标识所实例化的convertview用的是之前实例化的哪一个
- mData.get(position).put("n",
- mData.get(position).get("n") + " " + position);
- return convertView;
- }
- }
界面布局文件viewtest.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <ListView
- android:id="@+id/listView1"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- </ListView>
- </LinearLayout>
ListView 的Item布局文件listview_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" >
- <Button
- android:id="@+id/button1"
- android:layout_width="wrap_content"
- android:layout_height="60dip"
- android:text="" />
- </LinearLayout>