引用
今天实现了一个Adapter,通过自定义的XML文件内容来初始化,感觉还行,分享下,也请各位大虾给点意见~~
代码太多了,故只贴一小部分,请见谅~~
public class UIAdapter extends ArrayAdapter<Tag>
引用
反射机制需用到的方法名初始化:
/**
* 用于设置getItem方法中的反射的方法名itemType--------->method
*/
private final static void initMethodMap(){
methodMap.put(XmlConstant.ITEM_TYPE_TEXT, "initTextView");
methodMap.put(XmlConstant.ITEM_TYPE_BUTTON, "initButton");
methodMap.put(XmlConstant.ITEM_TYPE_IMAGE, "initImageView");
methodMap.put(XmlConstant.ITEM_TYPE_RADIOBUTTON, "initRadioButton");
methodMap.put(XmlConstant.ITEM_TYPE_IMAGEBUTTON, "initImageButton");
methodMap.put(XmlConstant.ITEM_TYPE_CHECKBOX, "initCheckBox");
}
private void initItem(RelativeLayout rLayout, Tag item){
try {
View view = initUniform(rLayout, item);
if(view == null){
return;
}
//通过反射机制执行相应的方法
String itemType = item.getAttributes().get(XmlConstant.ATTR_TYPE);
Method method = this.getClass().getMethod(methodMap.get(itemType),
new Class[]{View.class, Tag.class});
method.invoke(this, new Object[]{view, item});
} catch (Exception e) {
e.printStackTrace();
}
}
引用
不同的控件的各自的设置,里面的具体实现我省略了:
//------------一下是各种具体控件类型的具体属性设置,通过反射机制来调用----------------------
//注意:方法一定要为public,否则将找不到方法
public void initTextView(View view, Tag item){...}
public void initButton(View view, Tag item){...}
public void initImageView(View view, Tag item){...}
public void initRadioButton(View view, Tag item){...}
public void initImageButton(View view, Tag item){...}
public void initCheckBox(View view, Tag item){...}
引用
子类通过重写这个方法来设置具体的监听
protected void bindListener(View view, Tag item){
}
引用
其中:Tag为自己定义的一个保存Xml信息的类,通过Xml的读取实例化,其属性如下:
protected String tagName;
protected Tag parent;
protected HashMap<String, List<Tag>> children;//通过tagName--->名为tagName的子Tag的List
protected HashMap<String, String> attributes;//属性名--->属性值
protected String text;
protected int depth = 0;//Tag的深度,root的深度为1
引用
XmlConstant中则是存储了各种Xml字段的常量。
通过构建这个Adapter,我可以很轻松的实现GridView、ListView等的设置。我现在用在自己写demo时主界面的设置(GridView),可以很轻松的通过Xml配置主界面的菜单,通过点击跳转到正在编写的模块界面中。
今天主要碰到的一个问题是ListView中的ImageButton优先级大于ListView,导致ListView的setOnItemClickListener被屏蔽掉了。网上找了下资料,发现只要将模板Xml中的Layout设置:android:descendantFocusability="blocksDescendants",以及里面的ImageButton设置:android:focusable="false"即可。
第一次来JavaEEn写这些东西,写的不好还请包涵,也希望说大家能够从中得到点启发,更希望大家能给点建议,共同进步!!