viewHolder,setTag,getTag,setId,getId的使用
2015-09-07 11:20
615 查看
需求:
在java中显示列表数据时,往往这个list的每个item的数据类型和显示的布局都是不一样的,这时候就需要用到viewHolder,以方便进行显示的item的data和相对应view的管理。通常一个viewholder类包括了数据部分和view对象如(TextView,ImageView等等)。
组成部分
(1)数据data部分
(2)view对象组成定义
使用
onclick方法:
在java中显示列表数据时,往往这个list的每个item的数据类型和显示的布局都是不一样的,这时候就需要用到viewHolder,以方便进行显示的item的data和相对应view的管理。通常一个viewholder类包括了数据部分和view对象如(TextView,ImageView等等)。
组成部分
(1)数据data部分
private static class ViewHolder { public TMLifeMasterListItemData data; }
(2)view对象组成定义
private static class BannerViewHolder extends ViewHolder { public ArrayList<TMImageView> imageViewList=new ArrayList<TMImageView>(); public TMBizgroupBanner groupBanner; }
使用
private View createBannerView(int position, View convertView, ViewGroup parent) { TMLifeMasterBannerItemData bannerItemData=(TMLifeMasterBannerItemData)getItem(position); View view = null; BannerViewHolder vh = null; if (convertView == null) { switch (bannerItemData.bannerType) { case "A": view = layoutInflater.inflate(R.layout.tm_bizgroup_lifemaster_item_banner_type_a, parent, false); vh = new BannerViewHolder(); vh.groupBanner=(TMBizgroupBanner) view.findViewById(R.id.banner_a_pic_group); vh.groupBanner.initContext(context); LinearLayout bannerContainerA = (LinearLayout) view.findViewById(R.id.banner_a_container); bannerContainerA.getLayoutParams().height = (int) (scrWidth * 0.267f); vh.groupBanner.setItems(bannerItemData); vh.groupBanner.setAutoScroll(true); vh.groupBanner.setRatio(1); vh.groupBanner.setOnClickListener(this); view.setId(R.id.lifemaster_banner_card); break; case "B": view = layoutInflater.inflate(R.layout.tm_bizgroup_lifemaster_item_banner_type_b, parent, false); vh = new BannerViewHolder(); vh.imageViewList.add((TMImageView) view.findViewById(R.id.banner_b_pic1)); vh.imageViewList.add((TMImageView) view.findViewById(R.id.banner_b_pic2)); LinearLayout bannerContainerB = (LinearLayout) view.findViewById(R.id.banner_b_container); bannerContainerB.getLayoutParams().height = (int) (scrWidth * 0.267f); for (TMImageView imageView : vh.imageViewList) { imageView.setPlaceHoldImageResId(R.drawable.tm_bizgroup_icon_lifemaster_defimg); imageView.setOnClickListener(this); imageView.setId(R.id.lifemaster_banner_card); } break; case "C": view = layoutInflater.inflate(R.layout.tm_bizgroup_lifemaster_item_banner_type_c, parent, false); vh = new BannerViewHolder(); vh.imageViewList.add((TMImageView)(view.findViewById(R.id.banner_c_pic1))); vh.imageViewList.add((TMImageView)(view.findViewById(R.id.banner_c_pic2))); vh.imageViewList.add((TMImageView)(view.findViewById(R.id.banner_c_pic3))); LinearLayout bannerContainerC = (LinearLayout)(view.findViewById(R.id.banner_c_container)); bannerContainerC.getLayoutParams().height = (int) (scrWidth * 0.533f); for (TMImageView imageView : vh.imageViewList) { imageView.setPlaceHoldImageResId(R.drawable.tm_bizgroup_icon_lifemaster_defimg); imageView.setOnClickListener(this); imageView.setId(R.id.lifemaster_banner_card); } break; default: view = null; } view.setTag(vh); } else { view = convertView; vh = (BannerViewHolder) view.getTag(); } initializeTypeBCBannerView(position, vh); return view; } private void initializeTypeBCBannerView(int position, BannerViewHolder vh) { TMLifeMasterBannerItemData itemData = (TMLifeMasterBannerItemData)getItem(position); itemData.position = getItemViewType(0) == TMLifeMasterListItemData.TYPE.BANNER ? position - 1 : position; vh.data = itemData; for(int i=0;i<vh.imageViewList.size();i++) { vh.imageViewList.get(i).setImageUrl(itemData.bannerDatas.get(i).itemImage); vh.imageViewList.get(i).setTag(itemData.bannerDatas.get(i).exportAsJsonString()); } }
3. 在view的初始化过程中,可以定义一个相应的viewholder,存储了这个view相对应的data和view对象,并使用view.setTag(vh),将viewholder赋给view对象,当需要对这个view定义onclick事件时,使用getTag,并判定getTag获得的数据类型,如果是viewholder对象,就可以将与这个view对应的所有数据提取出来,进行数据处理和操作。 当然setTag方法不仅仅可以穿viewholder类型的对象,也可以穿String如json数据,这样如果一个item view中的每一个子view也需要定义onclick事件时,就可以通过setTag传送与这个子view相对应的json字符串,然后在点击事件中getTag,获得需要的数据。 另外类似的还有setId和getId方法,可以用来区分不同类型的点击事件,在每一个view初始化的时候,setId分配一个Id号,在onClick事件中,通过view.getId()方法,获得Id号,根据Id号做不同的处理。 Id号的定义方式:
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <item name="lifemaster_tag_card" type="id" /> <item name="lifemaster_shop_card" type="id" /> <item name="lifemaster_item_card" type="id" /> <item name="lifemaster_album_card" type="id" /> <item name="lifemaster_banner_card" type="id" /> <item name="lifemaster_card_id" type="id" /> <item name="lifemaster_stage_tag_id" type="id" /> <item name="lifemaster_tag_header_id" type="id" /> <item name="renewal_header_block_left" type="id" /> <item name="renewal_header_block_right" type="id" /> <item name="newhot_footer_id" type="id" /> <item name="newhot_item_id" type="id" /> </resources>
onclick方法:
public void onClick(View v) { int id = v.getId(); ViewHolder vh = null; if (v.getTag() instanceof ViewHolder) { vh = (ViewHolder)v.getTag(); commitCtrlEvent(vh.data); } if (id == R.id.lifemaster_item_card) { if (itemCardSelectCallback != null && vh instanceof ItemViewHolder) { ItemViewHolder itemVH = (ItemViewHolder)vh; itemCardSelectCallback.onItemCardSelected((TMLifeMasterItemItemData)vh.data, itemVH.imageView.getDrawable(), v.getTop()); } } else if (id == R.id.lifemaster_tag_card) { String json = (String)v.getTag(); TMLifeMasterTagData tag = TMLifeMasterTagData.createFromJsonString(json); HashMap<String, Object> args = new HashMap<String, Object>(); args.put("id", tag.itemId); TMStaUtil.commitCtrlEvent(ITMBizgroupConstants.STA_CT.CT_LIFEMASTER_HOME_TAG_CLK, args); uiEventListener.onTrigger(TMLifeMasterModel.EVENT_SHENGHUOJIA_TAG, json); } else if (id == R.id.lifemaster_album_card || id == R.id.lifemaster_shop_card) { String spmC = id == R.id.lifemaster_banner_card ? "banner" : "list"; int position = id == R.id.lifemaster_banner_card ? 0 : (getItemViewType(0) == TMLifeMasterListItemData.TYPE.BANNER ? vh.data.position - 1 : vh.data.position); String spm = TMStaUtil.createSpmUrl(((TMActivity) context).createPageSpmB(), spmC, position); String action = TMStaUtil.appendSpmScmToUrl(vh.data.itemLink, vh.data.scm, spm); uiEventListener.onTrigger(TMLifeMasterModel.EVENT_ACTION_JUMP, action); } else if(id== R.id.lifemaster_banner_card) { String json = (String)v.getTag(); TMLifeMasterBannerData bannerData = TMLifeMasterBannerData.createFromJsonString(json); uiEventListener.onTrigger(TMLifeMasterModel.EVENT_ACTION_JUMP,bannerData.itemLink); } }
相关文章推荐
- openGL图片占用内存计算
- 【HDOJ 4764】 Stone (博弈)
- 邻居好说话—冒泡排序
- Algorithm --> 棋盘中求出A到B的最小步数
- bootstrap 轮播总结
- JVM原理讲解和调优
- JVM原理讲解和调优
- Hibernate – One-to-Many example (XML Mapping)
- 马哥linux+python——2015年9月1日课程作业
- zabbix安装------安装php
- 使用Cocos2d-x 3.2和Cocos Studio做屏幕适配方案总结
- UICollectionView基础
- j2ee笔记
- java异常处理机制finally中的return返回
- java注释量统计代码实现
- SpringMVC整合Mybatis做的一个简单的查询功能
- 快速排序
- JQuery封装插件
- FIR Matlab DSP
- 挂机游戏隐藏窗口代码