Android基于SackOfViewAdapter类实现类似状态通知栏的布局
2012-09-17 20:36:36 来源:WEB开发网核心提示: 一般来说,ListView的列表项都会采用相同的布局,Android基于SackOfViewAdapter类实现类似状态通知栏的布局,只是填充的内容不同而已,这种情况下,则返回true */ @Override public boolean isEnabled(int position) {
一般来说,ListView的列表项都会采用相同的布局,只是填充的内容不同而已,这种情况下,Android提供了convertView帮我们缓存列表项,达到循环利用的目的,开发者也会使用ViewHolder模式来对ListView进行优化。但有的情况下,ListView的列表项布局是不尽相同的,甚至差别很大,这时就不能简单的使用同一个布局资源文件来表示不同类型的列表项了,而是必须区别对待。典型的情况如Android状态通知栏,如下图所示。
360安全卫士、唱吧,闪推这三款应用在状态通知栏的布局差别很大,那么我们又想使用同一个Adapter来表示不同列表项,这时就需要在Adapter中使用容器来包含这些不同的View了。这里定义SackOfViewAdapter类,继承BaseAdapter,在该类中定义容器变量mViewList来存储ListView中不同列表项的view;同时,定义两个构造函数,一个是在参数中指定容器的大小,并填充null值;一个则直接传入ListView列表项中所有view的集合。代码如下:
SackOfViewAdapter类的关键代码在newView函数和getView函数,其中newView函数用于给容器变量mViewList中值为null的元素赋值,一般由SackOfViewAdapter的子类实现。而getView函数重写自BaseAdapter类,是Adapter返回View类实例的关键函数,代码如下所示:
SackOfViewAdapter类的完整代码如下所示:
- public class SackOfViewsAdapter extends BaseAdapter {
- private List<View> mViewList = null;
- /**
- * 构造大小为count,值为null的view集合,这时需要子类重写newView函数
- */
- public SackOfViewsAdapter(int count) {
- super();
- mViewList = new ArrayList<View>(count);
- for (int i = 0; i < count; i++) {
- mViewList.add(null);
- }
- }
- /**
- * 由传入的view集合直接给容器赋值,如果view集合中有为null值的view,则子类必须实现newView函数
- */
- public SackOfViewsAdapter(List<View> views) {
- super();
- this.mViewList = views;
- }
- /**
- * 返回对应位置的列表项
- */
- @Override
- public Object getItem(int position) {
- return mViewList.get(position);
- }
- /**
- * 返回列表项的个数
- */
- @Override
- public int getCount() {
- return mViewList.size();
- }
- /**
- * getView函数创建的列表项类型个数
- */
- @Override
- public int getViewTypeCount() {
- return getCount();
- }
- /**
- * getView函数创建的view类型值,这里以view所在的位置作为类型值
- */
- @Override
- public int getItemViewType(int position) {
- return position;
- }
- /**
- * 如果Adapter中所有列表项都是可点击和可选择的,则返回true
- */
- @Override
- public boolean areAllItemsEnabled() {
- return false;
- }
- /**
- * 如果position所指的列表项不是分隔符,则返回true
- */
- @Override
- public boolean isEnabled(int position) {
- return false;
- }
- /**
- * 返回指定位置position的列表项的view
- */
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- View result = mViewList.get(position);
- // 如果mViewList中的view为null,则需要调用newView函数来创建一个,该函数由子类来实现
- if (result == null) {
- result = newView(position, parent);
- mViewList.set(position, result);
- }
- return result;
- }
- /**
- * 创建列表中指定位置的列表项,该函数有子类实现
- */
- protected View newView(int position, ViewGroup parent) {
- throw new RuntimeException("You must override newView()!");
- }
- /**
- * 获得指定位置的列表项的id
- */
- @Override
- public long getItemId(int position) {
- return position;
- }
- /**
- * 判断Adapter中是否存在某个指定的view
- */
- public boolean hasView(View v) {
- return mViewList.contains(v);
- }
- }
Tags:Android 基于 SackOfViewAdapter
编辑录入:爽爽 [复制链接] [打 印]- ››Android 当修改一些代码时,使用什么编译命令可以最...
- ››Android 如何添加一个apk使模拟器和真机都编译进去...
- ››Android 修改Camera拍照的默认保存路径
- ››Android 如何修改默认输入法
- ››android开发中finish()和System.exit(0)的区别
- ››Android手势识别简单封装类
- ››android中查看项目数字证书的两种方法
- ››Android中获取IMEI码的办法
- ››android 相机报错 setParameters failed
- ››Android重启运用程序的代码
- ››Android为ListView的Item设置不同的布局
- ››android bitmap与base64字符串的互相转换
赞助商链接