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

需求:

在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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值