Android绑定页面,Android下实现数据绑定功能

在编写Android应用的时候经常需要做的事情就是对View的数据进行设置,在Android下设置控件相对.net来说是件麻烦的事情,首先根据ID从view把控件找出来然后才能设置相应属性值;如果数据成员多那这些工作的是繁锁的事情。下面通过java提供的reflect的功能实现数据自动绑定功能。

在实现之前先描述一下实现的功能效果。

传统方式:

EditText editor = (EditText)v.findViewById(R.id.orders_orderid);

editor.setText(item.getOrderID());

editor =(EditText)v.findViewById(R.id.orders_employee);

editor.setText(item.getEmployee());

editor=(EditText)v.findViewById(R.id.orders_customer);

editor.setText(item.getCustomer());

editor =(EditText)v.findViewById(R.id.orders_orderdate);

editor.setText(item.getOrderDate());

editor =(EditText)v.findViewById(R.id.orders_requireddate);

editor.setText(item.getRequiredDate());

editor=(EditText)v.findViewById(R.id.orders_shipaddress);

editor.setText(item.getShipAddress());

editor =(EditText)v.findViewById(R.id.orders_shipcity);

editor.setText(item.getShipCity());

editor=(EditText)v.findViewById(R.id.orders_shipname);

editor.setText(item.getShipName());

editor =(EditText)v.findViewById(R.id.orders_shippedDate);

editor.setText(item.getShippedDate());

editor =(EditText)v.findViewById(R.id.orders_shipregion);

editor.setText(item.getShipRegion());

数据绑定方式:

orderproto.Order item = mOrders.get(position);

Binding binder = BindingFactory.GetBindig("order_list_view", v);

binder.Execute(v, item);

数据绑定描述

下面详细讲解实现方式,为了达到数据绑定功能首先要有一个信息描述;由于接触android不久所以暂不清楚如何给控件添加一些自定义的XML描述,所以直接采用了ContentDescription这个属性来完成绑定描述的工作。约定绑定表达式为"bind:member".

当有了绑定描述信息后要做的事情就是找出容器中有那些控件存在绑定描述和对应的绑定的属性。

private void findChild(View view) {

ViewGroup bg = null;

View nextChild = null;

if (view instanceof ViewGroup)

bg = (ViewGroup) view;

if (bg != null) {

for (int i = 0; i < bg.getChildCount(); ++i) {

nextChild = bg.getChildAt(i);

if (nextChild instanceof ViewGroup) {

findChild(nextChild);

} else {

CharSequence cs = nextChild.getContentDescription();

String bindinfo = null;

if (cs != null)

bindinfo = nextChild.getContentDescription().toString();

if (bindinfo != null && bindinfo.indexOf("bind:") == 0) {

String member = bindinfo.split(":")[1];

mControls

.add(new Control(nextChild.getId(),

new ControlHandler(

nextChild.getClass(), member)));

}

}

}

}

}

实现代码并不复杂,递归的方式寻找控件如果存在绑定信息的情况下添加了绑定列表中。

数据绑定接口

由于数据输出控件是不固定的,因此需要制定一个绑定接口;具体控件绑定就通过实现该接口来处理具体的工作。

public interface IControlDataBinder {

void SetValue(View e,Object value,String format);

Object GetValue(View e);

}

TextView的实现

public class TextViewDataBinder implements IControlDataBinder {

@Override

public void SetValue(View e, Object value, String format) {

// TODO Auto-generated method stub

TextView control=(TextView)e;

if(format==null || format.equals(""))

{

control.setText(value.toString());

}

else

{

control.setText(String.format(format, value));

}

}

@Override

public Object GetValue(View e) {

// TODO Auto-generated method stub

TextView control=(TextView)e;

return control.getText().toString();

}

}

EditText的实现

public class EditTextDataBinder implements IControlDataBinder {

@Override

public void SetValue(View e, Object value, String format) {

// TODO Auto-generated method stub

EditText control=(EditText)e;

if(format==null || format.equals(""))

{

control.setText(value.toString());

}

else

{

control.setText(String.format(format, value));

}

}

@Override

public Object GetValue(View e) {

// TODO Auto-generated method stub

EditText control=(EditText)e;

return control.getText().toString();

}

}

对于其它控件则根据自己需要来实现。

对象数据获取

在java似乎不存在象c#那样的属性,要么是Field或方法。所以通过名称来得到绑定信息就要做一些简单的处理,如果Field不存储则要检索一下对应的get方法。

public MemberInvoke(Class> type,String name)

{

try

{

mField = type.getField(name);

mIsMethod= false;

mInvalid = false;

}

catch(Exception e)

{

}

if(mInvalid)

{

try

{

mGetMethod = type.getMethod("get"+name);

mIsMethod= true;

mInvalid = false;

}

catch(Exception e)

{

}

}

}

数据绑定的具体工作

通过名称找到对应的Binding对象,所以名称和View在使用的时候必须保持一致。

private static HashMap mBindingTbl = new HashMap();

public static Binding GetBindig(String name,View view)

{

Binding result = null;

result = mBindingTbl.get(name);

if(result ==null)

{

result = new Binding(view);

mBindingTbl.put(name, result);

}

return result;

}

找到相应Binding对象后直接处理所有需要绑定的控件即可。

public void Execute(View view, Object source) {

try {

for (Control item : mControls) {

item.Handler.ToControl(view.findViewById(item.ID), source);

}

} catch (Exception e) {

}

}

下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值