您的位置:首页 > 其它

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

2015-09-07 11:20 615 查看
需求:

在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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: