MVC开发:M为Module,在安卓中为javaBean,用于封装数据。
V为View,在安卓中为解析Xml布局文件得到的View。
C为Controller,在安卓中为Holder类。
Module,View和Controller的关系为如图所示:
1,在控制器Holder中解析Xml文件获得View。
2,把数据模型javaBean传递给控制器Holder。
3,控制器Holder把javaBean数据赋值给View显示出来。
Holder基类代码如下:
public abstract class BaseHolder<T> {
/**
* 上下文对象
*/
protected Context context;
/**
* javaBean数据
*/
private T data;
/**
* 布局View
*/
private View view;
public BaseHolder(Context context,ViewGroup parent) {
this.context=context;
view=initView(parent);
//把holder和布局View绑定在一起
view.setTag(this);
}
/**
* 传递javaBean数据
* @param data
*/
public void setData(T data){
this.data=data;
//获得数据后给布局view赋值
refreshView();
}
/**
* 获得javaBean数据
* @return
*/
public T getData(){
return data;
}
/**
* 获得布局View
* @return
*/
public View getRootView(){
return view;
}
/**
* 初始化布局View
* @param parent
* @return
*/
public abstract View initView(ViewGroup parent);
/**
* 给布局View赋值显示
*/
public abstract void refreshView();
}
典型用途:用于ListView和GridView中的循环复用条目Item,和适配器结合试用。
基类适配器代码如下:
public abstract class BaseHolderAdapter<T> extends BaseAdapter {
private List<T> dataList;
public BaseHolderAdapter(List<T> dataList) {
this.dataList=dataList;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int position) {
return dataList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<T> baseHolder;
if(convertView==null){
baseHolder=getBaseHolder(parent);
}else{
baseHolder=(BaseHolder<T>) convertView.getTag();
}
baseHolder.setData(dataList.get(position));
return baseHolder.getRootView();
}
public abstract BaseHolder<T> getBaseHolder(ViewGroup parent);
}
继承基类BaseHolder的代码如下:
/**
* 拼团列表的Holder
* @author Administrator
*
*/
public class GroupBuyingHolder extends BaseHolder<GroupBuyingBean> {
@ViewInject(R.id.iv_groups_icon)
ImageView iconIv;
@ViewInject(R.id.tv_groups_des)
TextView desTv;
@ViewInject(R.id.tv_groups_title)
TextView titleTv;
@ViewInject(R.id.tv_groups_price)
TextView priceTv;
@ViewInject(R.id.tv_groups_market_price)
TextView marketPriceTv;
@ViewInject(R.id.ll_groups_begain)
LinearLayout begainGroupsLl;
//参团
@ViewInject(R.id.ll_join_layout)
LinearLayout joinLl;
@ViewInject(R.id.tv_join_begain)
TextView joinTv;
@ViewInject(R.id.tv_join_has_number)
TextView joinHasNumberTv;
public GroupBuyingHolder(Context context, ViewGroup parent) {
super(context, parent);
}
@Override
public View initView(ViewGroup parent) {
View view=UiUtils.inflater(context, R.layout.view_item_group_buying, parent);
ViewUtils.inject(this, view);
return view;
}
@Override
public void refreshView() {
final GroupBuyingBean bean = getData();
BitmapManager.getInstance(context).getBitmapUtils().display(iconIv, bean.getImage1(), new BitmapLoadCallBack<View>() {
@Override
public void onLoadCompleted(View arg0, String arg1, Bitmap arg2,
BitmapDisplayConfig arg3, BitmapLoadFrom arg4) {
BitmapUtils.setImageViewMathParent((Activity)context, iconIv, arg2);
iconIv.setBackgroundResource(R.color.white);
}
@Override
public void onLoadFailed(View arg0, String arg1, Drawable arg2) {
iconIv.setBackgroundResource(R.drawable.ic_product_default);
}
});
titleTv.setText(bean.getProduct_name());
desTv.setText(bean.getDescription());
priceTv.setText(UiUtils.getString(R.string.groups_price, bean.getUnit_price()));
marketPriceTv.setText(UiUtils.getString(R.string.groups_market_price, bean.getOrg_price()));
//进入开团页面
begainGroupsLl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle args=new Bundle();
args.putString(GroupBuyingDetailFragment.FIGHT_GROUPS_ID_BUNDLE_KEY, bean.getProduct_id());
UiHelper.showSingleBackActivityPage(context,SingleBackPageFragments.GROUP_BUYING_DETAIL, args);
}
});
//进入参团页面
joinHasNumberTv.setText(UiUtils.getString(R.string.groups_join_has_number,bean.getJoin_num()));
joinLl.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Bundle args=new Bundle();
args.putString(GroupBuyingDetailFragment.FIGHT_GROUPS_ID_BUNDLE_KEY, bean.getProduct_id());
UiHelper.showSingleBackActivityPage(context,SingleBackPageFragments.GROUP_BUYING_JOIN, args);
}
});
changeJoinStyle(Integer.valueOf(bean.getJoin_num()));
}
/**
* 改变参团的样式(可参团和不可参团)
* @param number
*/
private void changeJoinStyle(int number){
if(number>0){
joinLl.setClickable(true);
joinLl.setBackgroundResource(R.drawable.group_join_bg_orange);
}else{
joinLl.setClickable(false);
joinLl.setBackgroundResource(R.drawable.group_join_bg_gray);
}
}
}
给ListView设置适配器代码如下:
BaseHolderAdapter<GroupBuyingBean> adapter=new BaseHolderAdapter<GroupBuyingBean>(fightGroupsList) {
@Override
public BaseHolder<GroupBuyingBean> getBaseHolder(ViewGroup parent) {
return new GroupBuyingHolder(ctx, parent);
}
};
listView.setAdapter(adapter);
这个是典型的应用,还有如果相同的局部View在应用中出现多次,可以用面向MVC的Holder编程封装局部View,这样可以减少代码的复用性。
结束:欢迎大家批评和指正,共同交流学习。