(柯昌合深入研究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代码如下:
界面布局文件viewtest.xml:
ListView 的Item布局文件listview_item.xml
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>
相关文章推荐
- [置顶] (柯昌合深入研究Android SimpleAdapter BaseAdapter 的getView(int position, View convertView, ViewGroup pa
- ListView自定义Adapter中getView(int position, View convertView, ViewGroup parent) 使用
- ListView自定义Adapter中getView(int position, View convertView, ViewGroup parent) 使用
- public View getView(int position, View convertView, final ViewGroup parent)三个参数的意思
- Android 重写BaseAdapter碰到getView中convertView出现错误
- Android-BaseAdapter中重写getview的心得以及发现convertView回收的机制
- Android 自定义adapter的getView中的ViewGroup parent的宽度不正确
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- android baseadapter getview() viewhandler机制详解
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- Android之BaseAdapter—convertView回收机制与动态控件响应
- BaseAdapter中重写getview的心得以及发现convertView回收的机制
- listview自定义Adapter中重写getview深入了解--convertView ViewHolder
- Android之RecyclerView的原生Bug-Inconsistency detected. Invalid view holder adapter positionViewHolder{a1bbfa3 position=2 id=-1, oldPos=-1, pLpos:-1 no parent}
- Error:(13, 8) 错误: xxx不是抽象的, 并且未覆盖xxx中的抽象方法onBindViewHolder(BaseSimpleRecyclerAdapter.ViewHolder,int)
- BaseAdapter中重写getview的心得以及发现convertView回收的机制