天天看点

反射+多态:生成容器实例化并装好view子类

简单实现步骤:

两个方法,一个提供完整包名.类以及资源所在引用(android的话就是xml的id);

另外一个方法就是用反射加上多态实现的装载;

private List<View> getViewList(List<View> list){
		if(list == null)
			list = new ArrayList<View>();
		String vName[] = {"com.sansui.Memo.MemoView",
					"com.sansui.Calendar.CalendarView","com.sansui.ClassRoom.ClassRoom"};
		int vNo[] = {R.layout.memoview, R.layout.calendarview , R.layout.classroomview};
		for(int i = 0 ; i < vNo.length ; i++)
			list.add(getInstanceView(vName[i],vNo[i]));
		return list; 
	}
           

这里要解释下: 装载在vNames的三个类是自定义控件的类,其最上层父类是View(类似于j2se的object吧);

private View getInstanceView(String className,int resouces){
		XmlPullParser parser = this.getResources().getXml(resouces);
		AttributeSet attributes = Xml.asAttributeSet(parser);
		Object view = null;
		try {
			Class clazz = Class.forName(className);
			Constructor con = clazz.getDeclaredConstructor(Context.class,AttributeSet.class);
			view = con.newInstance(MainView.this,attributes);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} 		
		return (View)view;
	}	
	
           

再用一个简单的反射装载好了类(也就是具体类和xml的匹配以及实例化);

再装入list容器中

    作用的话,应该是viewpager的设置吧,当时写这个就是这样打算的;是不是觉得很方便呢? 要是有多个view的话就很简单灵活的可以装载了,而且此类方法复用性相当高;