安卓中面向MVC的开发(面向Holder的编程)

         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,这样可以减少代码的复用性。


结束:欢迎大家批评和指正,共同交流学习。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值