自定义使用Adapter的组件(一)
来源:互联网 发布:matlab矩阵添加元素 编辑:程序博客网 时间:2024/05/16 15:11
这次,我要实现个类似京东商城android客户端上商品图片展示的组件,如下图展示爱疯4的组件,注意,不包含小箭头。【由于不方便上传图片,就只能使用网上图片了】
首先,我先实现上图的效果,要实现这种组件就必须继承AdapterView<ListAdapter>,实现构造方法、onMeasure()、onLayout()、setAdapter()方法。看代码:
public class ImageWallView extends AdapterView<ListAdapter>{ private ListAdapter mAdapter; private int unitWidth; //每个child的宽 private int numColumns; //屏幕展示的孩子的数目 /** * 构造方法 */ public ImageWallView(Context context) { super(context); } public ImageWallView(Context context, AttributeSet attrs) { super(context, attrs); } public ImageWallView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } /** * 继承AdapterView需要实现以下四个方法 * getAdapter() * setAdapter(ListAdapter adapter) * getSelectedView() * setSelection(int position) */ @Override public ListAdapter getAdapter() { return mAdapter; } @Override public void setAdapter(ListAdapter adapter) { this.mAdapter = adapter; //把所有的child添加到布局中 for(int i=0;i<mAdapter.getCount();i++){ View child = mAdapter.getView(i,null,this); addViewInLayout(child,i,child.getLayoutParams()); } } @Override public View getSelectedView() { return null; } @Override public void setSelection(int position) { } /** * 设置布局 */ @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { int childCount = getChildCount(); int pLeft = 0; int pTop = 0; int childWidth=0; int childHeight=0; if(childCount>0){ View child = getChildAt(0); LayoutParams p = child.getLayoutParams(); childWidth = p.width + child.getPaddingLeft() + child.getPaddingRight() ; //组件的宽度 childHeight = p.height + child.getPaddingTop() + child.getPaddingBottom(); //组件的高度 numColumns = (getMeasuredWidth() - getPaddingLeft() - getPaddingRight())/childWidth; //计算屏幕中可以放置几个child int spacing = (getMeasuredWidth() - getPaddingLeft() - getPaddingRight() - numColumns * childWidth)/numColumns; //计算child之间的平均空隙 int spacingLR = (getPaddingLeft() + getPaddingRight() )/2;//组件左右边的平均空隙 if(spacing > spacingLR){ // 当组件间的均距离大于两边的组件左右的空隙的平均值时,调整一下,这个只是为了样式,可越过 int outSpacing = spacing - spacingLR; setPadding(spacingLR+outSpacing,getPaddingTop(),spacingLR+outSpacing,getPaddingBottom()); } unitWidth = childWidth + spacing ; } for(int i=0;i<childCount;i++){ View child = getChildAt(i); pLeft = getPaddingLeft() + i * unitWidth+(int)offset; //child距离左端的距离 pTop = getPaddingTop(); //child距离顶端的距离 child.layout(pLeft,pTop,pLeft + childWidth,pTop + childHeight); } } /** * 设置大小 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //设置宽度和高度 setMeasuredDimension( getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec), //getDefaultSize() 获取参数两个值中较大的那个 getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec) ); }}
onMeasure() 中设置了组件的大小
onLayout() 中设置了传进来的ListAdapter内容怎样在组件中分布
setAdapter() 中把ListAdapter的内容加入组件中
使用:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:demo="http://schemas.android.com/apk/res/com.wxg.activity" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.wxg.view.ImageWallView android:layout_width="fill_parent" android:layout_height="100dp" android:paddingLeft="10dp" android:paddingTop="5dp" android:paddingRight="10dp" android:id="@+id/imageWallView" android:background="#ffffff" /> <TextView android:layout_height="fill_parent" android:layout_width="fill_parent" android:gravity="center" android:text="图片墙组件" android:textColor="#ffffff" android:textSize="25sp"/></LinearLayout>
有个地方需要注意,使用组件时要自定义Adapter,不能使用系统自带的Adapter。
这样,就可以实现想要的样式了,但是现在图片还不能随着手势滑动,在下篇中会实现随手势滑动。- 自定义使用Adapter的组件(一)
- 自定义使用Adapter的组件(二)
- Android中使用自定义Adapter(一)
- Android中使用自定义Adapter(一)
- 自定义Adapter的使用
- 自定义ListView使用的Adapter
- spinner使用自定义的Adapter
- android使用自定义的adapter
- listview自定义adapter的使用
- 自定义组件(一)
- Android 自定义adapter(一)
- SimpleAdapter与自定义Adapter的使用。
- Android学习笔记--自定义Adapter的使用
- android自定义adapter和bundle的使用
- 使用自定义Adapter的ListView优化方式
- 27、ListView使用自定义的Adapter
- Android中使用自定义Adapter(二)
- Android中使用自定义Adapter(二)
- orcle 11g创建表空间
- android中获得系统的时间
- 数字图像处理 对比度拉伸
- 正则表达式——匹配固定长度
- Linux LCD 10分钟黑屏,LCD自动关闭的简单解决办法
- 自定义使用Adapter的组件(一)
- ajax实现注册页面动态验证用户名是否已注册,不必提交即可验证。
- Android kernel下载编译方法
- Informix使用建议
- 利用dos命令初步杀毒--tasklist
- 12款精美的免费 CSS 网页模板下载
- ubuntu将打开终端添加到鼠标右键
- CSS浏览器兼容问题
- LVS部署(转载)