您的位置:首页 > 编程语言

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

2016-10-08 09:36 309 查看

分类模块显示

创建一个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.
babc
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());
}


onMeasure与onLayout方法总结:

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

l onLayout方法就是给子View分配位置和大小,所以在onLayout方法执行完之后我们就可以调用view.getWidth()方法来获取View的真正的大小了。其实View的大小就是我们分配的left、right、top、bottom相减而得出的。如width
= right – left,我们在安排子View的位置的时候是可以超出父容器的的大小范围的,子View的宽高也可以大于父容器,但是超出父容器范围的部分将无法显示,所以我们尽量让子View的位置范围在容器的大小范围内
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: