您的位置:首页 > 移动开发 > Android开发

(柯昌合深入研究Android SimpleAdapter BaseAdapter 的getView(int position, View convertView, ViewGroup parent)

2012-05-17 10:00 537 查看
在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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐