今天要实现一个类似viva上, 可以拉动的gallery
2012-11-09 11:32
597 查看
--------------------------------------------------------2012.11.9
自己是一个什么东西都记不住的人,所以要弄一个东西的时候,就重新查笔记,或者查demo
要实现类似的东西,首先 找了个demo ,发现,只能显示对应的图片,因为在 Adapter中的getView只返回原来初始化了的对应的图片作为每个item来显示
只能生成对应大小的item, 如果 要显示, 要么 让数组里面的大小增大到很大, 要么就让显示循环
没有多思考,又找了个demo
发现是这样做的
在getView里面循环下 取余得到对应的图片,
再把getCount 的数值 设置成最大值(很大的一个数)。
就可以相当于无限的2边拉了。
当然,在Activity最好设置成gallery.setSelection(Integer.MAX_VALUE/2);,
不然就只能一边无限拉了
问题:
BaseAdapter 下面的实现和构造过程?
本文参考了 :
http://blog.csdn.net/svrsimon/article/details/6935950
---------------------------------2012.11.13-----------异步加载中重复请求的问题
今天要对这个组件改动,要异步加载图片
于是,在getView中异步加载图片
问题来了,每次拉动,都会请求服务器,如果有5张图片,当拉到后面的时候,原来请求过的图片也会重新请求
于是,按照同事说的方法,把图片放到本地,如果本地有显示本地的;如果本地没有,就请求服务器显示,并且下载到本地。
这样做就不会因为拉动而频繁的请求服务器了。
-------------------------------2012.11.13-----------中间的图片和周围不一样
将 imageView.setBackgroundResource(R.drawable.online_list_item_default_img2);
改成了 imageView.setImageResource(R.drawable.online_list_item_default_img2);
再异步下载判断就可以了, 但是不知道为什么!
---------------------------------2012.11.13------------对BaseAdapter的理解(先简单看一下)
首先看源码
首先是,private final DataSetObservable mDataSetObservable = new DataSetObservable();
DataSetObservable 观察者,观察者模式??(有时间要具体看下)
参考:http://www.cnblogs.com/jerryxing/archive/2012/04/08/2438085.html(现在还不是很懂)
观察者模式, 参考文档:http://www.blogjava.net/supercrsky/articles/202544.html (先保存)
实现 implements ListAdapter, SpinnerAdapter 2个adapter接口 (o(︶︿︶)o 唉)
-------------------------------------------------11.13 ------观察者模式的理解(感觉还好,有时间看下 Button的监听过程)------
详情见【自己blog】:http://blog.csdn.net/q2390183798/article/details/8178983
-----------------------------------2012.11.13-------理解BaseAdapter-----------
先理解下 Observable<T> , 先写了 注册,删除,删除所有的方法,对于线程sychronized的 (不懂为什么要是抽象的???怕单独用?)
自己是一个什么东西都记不住的人,所以要弄一个东西的时候,就重新查笔记,或者查demo
要实现类似的东西,首先 找了个demo ,发现,只能显示对应的图片,因为在 Adapter中的getView只返回原来初始化了的对应的图片作为每个item来显示
public View getView(int position, View convertView, ViewGroup parent) { return mImages[position]; }
只能生成对应大小的item, 如果 要显示, 要么 让数组里面的大小增大到很大, 要么就让显示循环
没有多思考,又找了个demo
发现是这样做的
在getView里面循环下 取余得到对应的图片,
public View getView(int position, View convertView, ViewGroup parent){ ImageView imageView = new ImageView(mContext); imageView.setImageResource(resIds[position % resIds.length]); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setLayoutParams(new Gallery.LayoutParams(163, 106)); imageView.setBackgroundResource(mGalleryItemBackground); return imageView; }
再把getCount 的数值 设置成最大值(很大的一个数)。
public int getCount() { return Integer.MAX_VALUE; }
就可以相当于无限的2边拉了。
当然,在Activity最好设置成gallery.setSelection(Integer.MAX_VALUE/2);,
不然就只能一边无限拉了
问题:
BaseAdapter 下面的实现和构造过程?
本文参考了 :
http://blog.csdn.net/svrsimon/article/details/6935950
---------------------------------2012.11.13-----------异步加载中重复请求的问题
今天要对这个组件改动,要异步加载图片
于是,在getView中异步加载图片
问题来了,每次拉动,都会请求服务器,如果有5张图片,当拉到后面的时候,原来请求过的图片也会重新请求
于是,按照同事说的方法,把图片放到本地,如果本地有显示本地的;如果本地没有,就请求服务器显示,并且下载到本地。
这样做就不会因为拉动而频繁的请求服务器了。
-------------------------------2012.11.13-----------中间的图片和周围不一样
将 imageView.setBackgroundResource(R.drawable.online_list_item_default_img2);
改成了 imageView.setImageResource(R.drawable.online_list_item_default_img2);
再异步下载判断就可以了, 但是不知道为什么!
---------------------------------2012.11.13------------对BaseAdapter的理解(先简单看一下)
首先看源码
/** * Common base class of common implementation for an {@link Adapter} that can be * used in both {@link ListView} (by implementing the specialized * {@link ListAdapter} interface} and {@link Spinner} (by implementing the * specialized {@link SpinnerAdapter} interface. */ public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter { private final DataSetObservable mDataSetObservable = new DataSetObservable(); public boolean hasStableIds() { return false; } public void registerDataSetObserver(DataSetObserver observer) { mDataSetObservable.registerObserver(observer); } public void unregisterDataSetObserver(DataSetObserver observer) { mDataSetObservable.unregisterObserver(observer); } /** * Notifies the attached observers that the underlying data has been changed * and any View reflecting the data set should refresh itself. */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); } /** * Notifies the attached observers that the underlying data is no longer valid * or available. Once invoked this adapter is no longer valid and should * not report further data set changes. */ public void notifyDataSetInvalidated() { mDataSetObservable.notifyInvalidated(); } public boolean areAllItemsEnabled() { return true; } public boolean isEnabled(int position) { return true; } public View getDropDownView(int position, View convertView, ViewGroup parent) { return getView(position, convertView, parent); } public int getItemViewType(int position) { return 0; } public int getViewTypeCount() { return 1; } public boolean isEmpty() { return getCount() == 0; } }
首先是,private final DataSetObservable mDataSetObservable = new DataSetObservable();
DataSetObservable 观察者,观察者模式??(有时间要具体看下)
参考:http://www.cnblogs.com/jerryxing/archive/2012/04/08/2438085.html(现在还不是很懂)
观察者模式, 参考文档:http://www.blogjava.net/supercrsky/articles/202544.html (先保存)
实现 implements ListAdapter, SpinnerAdapter 2个adapter接口 (o(︶︿︶)o 唉)
-------------------------------------------------11.13 ------观察者模式的理解(感觉还好,有时间看下 Button的监听过程)------
详情见【自己blog】:http://blog.csdn.net/q2390183798/article/details/8178983
-----------------------------------2012.11.13-------理解BaseAdapter-----------
先理解下 Observable<T> , 先写了 注册,删除,删除所有的方法,对于线程sychronized的 (不懂为什么要是抽象的???怕单独用?)
/** * Provides methods for (un)registering arbitrary observers in an ArrayList. */ public abstract class Observable<T> { /** * The list of observers. An observer can be in the list at most * once and will never be null. */ protected final ArrayList<T> mObservers = new ArrayList<T>(); /** * Adds an observer to the list. The observer cannot be null and it must not already * be registered. * @param observer the observer to register * @throws IllegalArgumentException the observer is null * @throws IllegalStateException the observer is already registered */ public void registerObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null."); } synchronized(mObservers) { if (mObservers.contains(observer)) { throw new IllegalStateException("Observer " + observer + " is already registered."); } mObservers.add(observer); } } /** * Removes a previously registered observer. The observer must not be null and it * must already have been registered. * @param observer the observer to unregister * @throws IllegalArgumentException the observer is null * @throws IllegalStateException the observer is not yet registered */ public void unregisterObserver(T observer) { if (observer == null) { throw new IllegalArgumentException("The observer is null."); } synchronized(mObservers) { int index = mObservers.indexOf(observer); if (index == -1) { throw new IllegalStateException("Observer " + observer + " was not registered."); } mObservers.remove(index); } } /** * Remove all registered observer */ public void unregisterAll() { synchronized(mObservers) { mObservers.clear(); } } }
相关文章推荐
- 一个可以实现 左右联动JTable 的完全Dialog 实现类似 Excel的冻结第一列 效果
- android如果重写onDraw实现一个类似TextView可以显示表情和链接的控件(一)
- 最近被一个问题困扰着,如何实现类似Photoshop的多层图像操作,每层可单独操作,又可以组合显示出来。
- 今天学习的时候偶然发现了一个有趣的题目,可以用编程实现。
- 今天学习的时候偶然发现了一个有趣的题目,可以用编程实现。
- android如果重写onDraw实现一个类似TextView可以显示表情和链接的控件(二)
- 今天想到一个实现进度条的办法,一会可以试下
- iOS开发:一个瀑布流的设计与实现(已实现缓存池功能,该功能使得瀑布流cell可以循环利用)
- 用OC写一个可以分字母组,的电话薄,并实现功能
- 实现一个函数,可以左旋字符串中的k个字符
- 使用回调函数实现一个通用的冒泡排序,可以排序不同的数据类型。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 实现一个栈类,类似STL中的栈
- 用WindowManager实现一个类似ios悬浮可拖动的虚拟导航按钮
- 完成一个学生管理程序,使用学号作为键添加5个学生对象,并可以将全部信息保存在文件中,可以实现对学生信息的学号查找,输出全部学生信息的功能。
- 用C语言实现一个类似学籍管理系统的 e协 管理系统beta ( 正在完善中...)
- 如何实现 客户端仅用一个IP地址,就可以连接到不同的服务器上
- 【C语言】【面试题】使用main函数的参数,实现一个整数计算机,程序可以接受三个参数
- 今天实现了类似淘宝上划操作显示详情页的demo
- 今天找到一个简单好用的全选按钮功能实现