谷歌市场项目代码详解(四)
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的位置范围在容器的大小范围内
相关文章推荐
- 谷歌市场项目代码详解(五)
- 谷歌市场项目代码详解(二)
- 谷歌市场项目代码详解(三)
- 安卓项目五子棋代码详解(五)
- Goslate-免费谷歌翻译项目(文章包括完整的设计,代码,开源,部署过程)
- 第一个flask项目代码详解
- 安卓项目五子棋代码详解(三)
- 【Java项目实战】微信公众平台java开发详解(工程代码+解析)
- iOS NSCondition结合代码以及项目进行详解
- 向您的项目添加 C 和 C++ 代码 基于Android 2.2已经以上 新姿势 谷歌推荐的最新方式
- 安卓项目五子棋代码详解(四)
- Cocos2d-x手机游戏开发与项目实践详解_随书代码
- Storm项目:流数据监控2《代码详解…
- 超实用python小项目--基于python的手机通讯录二维码生成网站--2、python代码详解
- 谷歌推Android for Work项目 加快进军企业市场
- 图解翻译和详解深度学习GAN(含项目完整代码)
- 项目实战:谷歌电子市场学习笔记1
- 谷歌开源项目Google Preview Image Extractor(PIEX) (附上完整demo代码)