viewHolder,setTag,getTag,setId,getId的使用

来源:互联网 发布:淘宝背景音乐代码生成 编辑:程序博客网 时间:2024/03/28 20:10

需求:

在java中显示列表数据时,往往这个list的每个item的数据类型和显示的布局都是不一样的,这时候就需要用到viewHolder,以方便进行显示的item的data和相对应view的管理。通常一个viewholder类包括了数据部分和view对象如(TextView,ImageView等等)。

  1. 组成部分
    (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;    }
  1. 使用
  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
原创粉丝点击