谷歌市场项目代码详解(四)

分类模块显示

创建一个fragment_category.xml布局,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    
    <ListView 
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:listSelector="@android:color/transparent"
	  android:divider="@null"
	  android:dividerHeight="6dp" />

分类界面的ListView需要两种类型的布局

一种是标题   一种是图片组

创建对应的Adapter

public class CategoryListAdapter extends BasicAdapter<Object> {
	
	/** item类型为标题 */
	public static final int ITEM_TYPE_TITLE = 0;// item的type必须从0开始
	/** item类型Info */
	public static final int ITEM_TYPE_INFO = 1;

	public CategoryListAdapter(ArrayList<Object> datas) {
		super(datas);
	}
	
	/** 返回item有几种类型 */
	@Override
	public int getViewTypeCount() {
		return 2;
	}
	
	/** 返回指定position的item是属于哪种类型 */
	@Override
	public int getItemViewType(int position) {
		Object data = datas.get(position);
		return data instanceof String ? ITEM_TYPE_TITLE : ITEM_TYPE_INFO;
	}

	。。。还差3个方法

}
@Override
public int getItemLayoutId(int position) {
	int itemType = getItemViewType(position);
	return itemType == ITEM_TYPE_TITLE ? R.layout.item_category_title 
				                 : R.layout.item_category;
}

@Override
public Object createViewHolder(View convertView, int position) {
	ViewHolder holder = new ViewHolder();
	int itemType = getItemViewType(position);
	if (itemType == ITEM_TYPE_TITLE) { // 如果item类型是标题
		holder.title =  (TextView) convertView;
	} else {  // 如果item类型是Info
		// 获取第1个线性布局和它里面的子View
		holder.ll_1 = (LinearLayout) convertView.findViewById(R.id.ll_1);
		holder.iv_icon1 = (ImageView) convertView.findViewById(R.id.iv_icon1);
		holder.tv_name1 = (TextView) convertView.findViewById(R.id.tv_name1);
			
		// 获取第2个线性布局和它里面的子View
		holder.ll_2 = (LinearLayout) convertView.findViewById(R.id.ll_2);
		holder.iv_icon2 = (ImageView) convertView.findViewById(R.id.iv_icon2);
		holder.tv_name2 = (TextView) convertView.findViewById(R.id.tv_name2);
			
		// 获取第3个线性布局和它里面的子View
		holder.ll_3 = (LinearLayout) convertView.findViewById(R.id.ll_3);
		holder.iv_icon3 = (ImageView) convertView.findViewById(R.id.iv_icon3);
		holder.tv_name3 = (TextView) convertView.findViewById(R.id.tv_name3);
	}
	return holder;
}

@Override
public void showData(int position, Object viewHolder, Object data) {
	ViewHolder holder = (ViewHolder) viewHolder;
		
	int itemViewType = getItemViewType(position);
	if (itemViewType == ITEM_TYPE_TITLE) {
		// 如果当前位置是的item是标题类型
		holder.title.setText((String) data);
		int paddingTop = position == 0 ? 6 : 0;
		holder.title.setPadding(paddingTop, paddingTop, 0, 0);
	} else {
		// 如果当前位置的item是info类型
		Info info = (Info) data;
			
		// 显示一行中的第1个分类信息
		holder.tv_name1.setText(info.name1);
		ImageLoader.getInstance().displayImage(Urls.IMAGE + "?name=" + info.url1, holder.iv_icon1);
			
		// 显示一行中的第2个分类信息,这个信息有可能不存在,所以需要判断一下
		if (TextUtils.isEmpty(info.name2)) {
			holder.ll_2.setVisibility(View.INVISIBLE);
		} else {
			holder.ll_2.setVisibility(View.VISIBLE);
			holder.tv_name2.setText(info.name2);
			ImageLoader.getInstance().displayImage(Urls.IMAGE + "?name=" + info.url2, holder.iv_icon2);
		}
			
		// 显示一行中的第3个分类信息,这个信息有可能不存在,所以需要判断一下
		if (TextUtils.isEmpty(info.name3)) {
			holder.ll_3.setVisibility(View.INVISIBLE);
		} else {
			holder.ll_3.setVisibility(View.VISIBLE);
			holder.tv_name3.setText(info.name3);
			ImageLoader.getInstance().displayImage(Urls.IMAGE + "?name=" + info.url3, holder.iv_icon3);
		}
			
		// 把数据绑定到3个容器中
		holder.ll_1.setTag(info.name1);
		holder.ll_2.setTag(info.name2);
		holder.ll_3.setTag(info.name3);
			
		// 给一行中的3个分类注册点击事件
		holder.ll_1.setOnClickListener(onClickListener);
		holder.ll_2.setOnClickListener(onClickListener);
		holder.ll_3.setOnClickListener(onClickListener);
	}
}
	
OnClickListener onClickListener = new OnClickListener() {
		
	@Override
	public void onClick(View v) {
		UiUtils.showToast((String) v.getTag());
	}



onMeasureonLayout方法总结:

l onMeasure方法就是测量自己和指定期望View的宽高,测量出来之后setMeasuredDimension(measuredWidth, measuredHeight)来保存起来测量的值,保存后就可以调用view.getMeasuredWidth()方法来获取保存的值了,它仅仅是测量的值而已,不一定是View的真正大小,如上面的TextView,在onLayout时候我们给它的宽度加大了实际的宽不等于测量的宽getWidth() != getMeasuredWidth()

l onLayout方法就是给子View分配位置和大小,所以在onLayout方法执行完之后我们就可以调用view.getWidth()方法来获取View的真正的大小了。其实View的大小就是我们分配的leftrighttopbottom减而得出的。如width = right – left我们安排View的位置的时候是可以超出父容器的的大小范围的,子View的宽高也可以大于容器,但是超出父容器范围的部分将无法显示,所以我们尽量让子View位置范围在容器的大小范围内



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值