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

在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> list = new ArrayList>();
		for (int i = 0; i < 13; i++) {
			HashMap hashMap = new HashMap();
			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> mData;
		LayoutInflater inflater = null;

		public MySimpleAdapter(Context context,
				ArrayList> 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:

   





    
    


 

 

 

ListView 的Item布局文件listview_item.xml

  




    


 

你可能感兴趣的:((柯昌合深入研究Android SimpleAdapter BaseAdapter 的getView(int position, View convertView, ViewGroup parent))