viewHolder,setTag,getTag,setId,getId的使用
来源:互联网 发布:淘宝背景音乐代码生成 编辑:程序博客网 时间:2024/03/28 20:10
需求:
在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); } }
0 0
- viewHolder,setTag,getTag,setId,getId的使用
- Android setTag和getTag()的使用
- 【转】Android setTag和getTag()的使用
- android:View的setTag和getTag使用
- android:View的setTag和getTag使用
- View的setTag和getTag使用
- android:View的setTag和getTag使用
- android:View的setTag和getTag使用
- setTag(Object)/getTag()使用
- setTag()/getTag() 的用法
- View的setTag()和getTag()方法的使用
- View的setTag()和getTag()方法的使用
- BaseAdapter的使用步骤以及setTag和getTag的作用
- View的setTag和getTag方法的使用
- Android之:View的setTag()与getTag()方法使用
- View 的setTag()/getTag() 用法
- Android的setTag 和getTAG
- View的setTag() 和 getTag()
- python__模块
- 【连载】实用小demo连载 5 —— js 无限级菜单 demo
- jsp笔记
- JavaScript计算器
- openGL图片占用内存计算
- viewHolder,setTag,getTag,setId,getId的使用
- 按理来'|'说是个特殊字符,为啥split需要转义,用replace不需要转义
- MSSql Server基础学习系列———聚合函数
- count和count_if函数
- java解压缩文件
- 短信发送及其验证
- 获取屏幕截图ScreenShot
- Android 安装调试出错:Installation error: INSTALL_FAILED_MEDIA_UNAVAILABLE
- 【NCRE】——c# 给PPT判分