首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

浅谈Android设计模式学习之观察者模式

了,而ListView最重要的一个点就是Adapter,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged(), 这个方法就是用到了我们所说的观察者模式...* 数据集用变化时通知所有观察者 */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged...(); } } 可以发现,数据发生变化时候,notifyDataSetChanged中会调用mDataSetObservable.notifyChanged()方法 public class DataSetObservable...的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者 (AdapterDataSetObserver...而Adapter中包含一个数据集可观察者DataSetObservable,在数据数量发生变更时开发者手动调用AdapternotifyDataSetChanged,而notifyDataSetChanged

48210

Android设计模式学习之观察者模式

了,而ListView最重要的一个点就是Adapter,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged(), 这个方法就是用到了我们所说的观察者模式...* 数据集用变化时通知所有观察者 */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged...(); } } 可以发现,数据发生变化时候,notifyDataSetChanged中会调用mDataSetObservable.notifyChanged()方法 public class...的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者 (AdapterDataSetObserver...而Adapter中包含一个数据集可观察者DataSetObservable,在数据数量发生变更时开发者手动调用AdapternotifyDataSetChanged,而notifyDataSetChanged

29410
您找到你想要的搜索结果了吗?
是的
没有找到

观察者模式及在Android源码中的应用

Android源码中的应用 在以前,我们最常用到的控件就是ListView了,而ListView最重要的一个点就是Adapter,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged...* 数据集用变化时通知所有观察者 */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged...(); } } 可以发现,数据发生变化时候,notifyDataSetChanged中会调用mDataSetObservable.notifyChanged()方法 public class...ListView数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者...而Adapter中包含一个数据集可观察者DataSetObservable,在数据数量发生变更时开发者手动调用Adapter.notifyDataSetChanged,而notifyDataSetChanged

49910

Android设计模式--观察者模式

(相当于少了中间商赚差价,是不爽了很多,而且效率还比较高) 例四:Android中,我们常用的recyclerView,listView刷行数据调用notifyDataSetChanged()来更新ui...二、简单实现 我们假设开发一款新闻的软件,每当有新的内容推出,那么只要是订阅了该新闻的用户都可以接收到该新闻。 这种模式叫做发布–订阅模式,称为观察者模式。...User订阅了News之后,News有更新,就会去遍历所有观察者(User),然后给每一个观察者更新信息,即调用User的update()方法,这样就完成了一对多的通知功能。...adapter.notifyDataSetChanged()时,实际在遍历所有的观察者,并调用他们的onChanged方法,从而告诉观察者发生了变化。...数据发生变化时,调用Adapter的notifyDataSetChanged函数,该函数会调用AdapterDataObservable的notifyChanged函数,这个函数会调用所有观察者(RecyclerViewDataObserver

1.2K30

浅谈Adapter中观察者模式

有这么一种功能,当我们在商品列表中调整商品数量等信息的时候,下方的金额总数随之变化。 可以看出,这个界面有一个数据源,一个适配器,一个ListView。...总金额的布局是显示在ListView布局上面的。 那么怎么样可以列表数据源变化的时候,下方的总金额(ListView 之外的UI)变化?...但是这种方法列表项中能决定总金额的按钮比较多的时候,就会造成代码冗余。 2、给适配器设定一个观察者。数据发生变化的时候,观察者观察到并执计算总金额修改UI 我们这里学习第二种思路。...观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。...数据发生变化时UI发生变化。

1.2K120

ListView:The content of the adapter has changed but ListView did not receive a notification终极解决方法

)] 其实我在listview的adapter添加完数据后,使用了handler去调用datper.notifyDataSetChanged();来通知listview显示变化结果; 虽然自己很确定没有多线程操作...但是实际上用的时候我发现会出问题,想了想最彻底的解决办法 彻底解决方法: 把  listview的adapter数据更新和dapter.notifyDataSetChanged()方法的调用必须同时放到单独一个线程里...解决更新ListView数据时出现的问题分析总结:   没仔细读的话,一眼看去就说说在非UI线程去更新了ListVIew数据,然后下意识的认为是调用adapter.notifyDataSetChanged...方法的调用被放到了非UI线程,仔细一看是说更新ListView数据以及通知数据更新要放到同一个线程(主线程),是为了保持数据一致,adapter里面一般是会存放一个数组,对那个数据的修改和调用notifyDataSetChanged...方法要放到一起,而且是放到主线程,如果对数据的更新放到了子线程,notifyDataSetChanged调用在主线程,notifyDataSetChanged调用会默认把ListView绑定到主线程里面了

1.3K70

ThoughtWorks——结对编程

你可能已经用过ListView的adapter.notifyDataSetChanged来触发ListView的列表界面进行更新。...View的Listener监听会通过setOnClickListener给View传递一个Listener对象,相关的事件发生时是触发onClick(回调onClick)。...这其实也是一种观察者模式,OnClickListener是观察者,View是被观察者,View收到Click事件是会通知观察者执行onClick()。...使用设计模式是为了可重用代码、让代码容易被他人理解、保证代码可靠性。 设计模式的初衷是用经过检验的“套路”来提高代码的生产效率,人们容易理解约定成俗的“套路”。...观察者模式完美的将观察者和被观察的对象分离开,一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

3.2K30

ViewPager无限滑动

PagerAdapter.notifyDataSetChanged() PagerAdapter的数据发生改变时,必须执行此方法和关联的ViewPager进行同步,否则运行中会产生异常。...不过:PagerAdapter不像BaseAdapter那样,notifyDataSetChanged方法在UI表现上是有问题的,建议每次数据发生变化后,直接使用setAdapter重新关联。...ViewPager的局限性 1. setCurrentItem卡顿 getCount返回的页数非常大的时候,比如10亿,调用setCurrentItem会引起ANR。...PagerAdapter的notifyDataSetChanged并不像它应该承诺的那样,而为了实现在Adapter数据发生变化后通知更新ViewPager的目的:需要再次执行viewPager.setAdapter...关于viewPager设计的吐槽 ViewPager显然是按照了ListView那样的方式来计算总页数的,但是对于一个每次只显示3页的View来说,每次左滑和右滑的时候调用一个让子类重写的判断是否还有左边

2.2K70

BaseAdapter的notifyDataSetChanged方法

都用过 BaseAdapter的notifyDataSetChanged()方法,用法很简单,BaseAdapter的数据更新了,需要更改显示,这时候就要调用notifyDataSetChanged(...void notifyDataSetInvalidated() { mDataSetObservable.notifyInvalidated(); } 这四个函数前两个用于注册和接触内容监听器,后两个是用来通知数据发生变化...总结而言,NotifyDataSetChanged就是告诉ListView数据变化了,进行数据改变,setAdapter函数将清空所有的数据,并且重新设置监听和添加View。这点有很大的不同。...:继续看源码: a.设置了数据发生变化的表示 mDataChanged=true; b.将没ItemCount赋值给mOldItemCount,也就是数据变化了,但是保留之前的数据数量。...所谓的数据变化监听就是这么回事。就是通知数据变了,然后ListView通知变化。那执行完这段代码之后会执行什么呢?

88630

RecyclerView.Adapter notifyDataSetChanged 不起作用

如果应用启动,不在聊天界面,接收到消息后就弹出通知栏消息通知用户,点击进入聊天界面。 如果用户已经在聊天界面,就要将接收到数据添加到adapter里,动态显示消息。...问题卡在,接收到消息后调用更新界面回调,给adapter里add新数据,然后调用adapter.notifyDataSetChanged()。 结果数据并没有刷新!...找了很久,最后在StackOverFlow上找到了答案,原文在这里 原来在我后台接收到数据调用更新界面回调方法时,其实和当前Activity不在同一个线程,我忙傻了把这点给忘了。...在回调里应该通过Handler发送数据到主线程,然后再给adapter里填数据调用notifyDataSetChanged(); 线程回调方法里: Message handleMsg = new Message...,然后再调用RecyclerView.Adapter的 notifyDataSetChanged方法。

2.8K00

Android编程设计模式之观察者模式实例详解

ConcreteSubject:具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题角色又叫做具体被观察者(ConcreteObservable...,通知所有观察者 */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); } } 看看...Adapter的notifyDataSetChanged的时候会调用所有观察者的onChanged方法,核心实现就在这里 @Override public void onChanged() {...requestLayout(); } // 代码省略 public void clearSavedState() { mInstanceState = null; } } ListView...的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者 (AdapterDataSetObserver

42510

ListView使用技巧-更新中

使用ViewHolder模式提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在getView()时重复的调用findViewById()....我们可以通过scrollbars属性来控制ListView的滚动状态。特别的,scrollbars设置为none时,ListView无论滚动还是不滚动,就都不会出现滚动条了。...动态修改ListView-notifyDataSetChanged notifyDataSetChanged mData.add("new"); notifyDataSetChanged(); 修改了传递给...Adapter的映射List之后,只需要通过调用Adapter的notifyDataSetChanged方法,通知ListView更改数据源即可完成对ListView的动态修改。...注意:在使用mAdapter.notifyDataSetChanged方法时,必须保证传进Adapter的数据List是同一个List而不能是其他对象,否则将无法实现改效果。

92330

Android动态修改ListView中指定Item的组件属性

方法主要有两种: 第一种方式:ListView中某一项的值发生变化之后,重新加载数据已达到更新ListView的目的。 虽然第一种方式能够解决问题,但不值得推荐。因为这样会带来不必要的资源消耗。...在移动终端这种硬件资源和计算能力都有限的情况下,显然有点得不偿失了,况且用户的体验不好。 第二种方式:第二种方式可以说是第一种方式的改进。...ListView中某一项的值发生改变,实际上是ListView数据发生了改变。既然数据发生了改变那么我们就修改数据源。...中tem的位置 } }); 步骤二:根据单击ListView中tem的位置更新ListView数据源,并通知适配器数据改变 String newFileName=edtFileName.getText...();//通知SimpleAdapter数据改变

3.7K80

观察者模式详解

被观察者状态发生变化的时候,就会去通知它的所有的观察者,然后由观察者根据被观察者的情况作出反应。观察者模式属于行为型模式。...在具体的内部发生改变时,给所有注册过的观察者发送通知。 Observer 观察者的抽象接口,在这个接口里面定义了一个更新方法,收到被观察者的通知的时候就更新。...这个时候某六想订奶,就可以告诉送奶工,以后他也要订奶了,以后来送奶的时候就通知某六了。 某一天,张三不想喝奶了,就告诉送奶工,他不再订奶了,那么以后送奶工再来送奶就不会通知张三了。...} 从源码中可以很容易的看到,这里有 被观察者对象 mDataSetObservable 数据发生变化的时候,我们就调用 notifyDataSetChanged() 方法,这个时候 被观察者对象...总结: 其实无论程序整体多复杂,观察者模式是永远不会变的,首先有一个被观察者,被观察者对象中持有观察者,被观察者发生变化的时候,调用被观察者的方法通知观察者(这个方法内通常会是 观察者调用自己对应的方法

40030

手机卫士黑名单功能(ListView结合SQLite增删改)

添加记录 调用Builder对象的show()方法,获取AlertDialog对象 调用View.inflate()方法,将布局文件转成View对象 调用View对象的findViewById()方法,...对象的dismiss()方法,可以关闭对话框 调用View对象的findViewById()方法,获取到各个控件的值,进行判断处理 调用之前定义好的Dao类BlackNumberAdo对象的add()方法...,数据库增加一条记录,参数:String电话号码,String拦截模式 此时ListView不会显出出来刚添加的记录,需要退出这个Activity重写进入,我们通知适配器数据更新 调用集合List对象的...add()方法,添加一条数据,参数:0(第一个),数据 调用ListAdapter对象的notifyDataSetChanged()方法,通知数据更新 删除记录 条目布局文件中,在右侧放置一个垃圾桶的小图标...对象的remove()方法,删除一条数据,参数:int索引 调用ListAdapter对象的notifyDataSetChanged()方法,通知数据更新 CallSmsSafeActivity.java

86930

GridView结合tablayout实现展开收缩功能

PS:最近有一些粉丝给我留言说怎么实现那种 上面多个item,然后可以展开收缩,点击了item后下方会出现一些数据,而且item对应多个型号,我当时看到这也就明白了他的意思,我上个图大家就明白了,这是腾讯云文章里的一个...实现展开收缩的方法可能有很多,今天这个方法个人感觉还是简单易懂的,就是获取到全部数据,然后再定义个只现实的listRow用来存放显示的数据,咱们是一行四列,所以,需要在全部数据中拿出前四个数据,放在list...中,然后通过适配器把list传进去显示,点击展开按钮时,再 去除全部数据放在listRow中,同时调用myGVAdapter.notifyDataSetChanged();这里可以直接把listDataAll...//定义在方法外 public List listS = new ArrayList();//显示tablayout下listview数据 public static...myGVAdapter2.notifyDataSetChanged();这里只通知listview就可以了,GV通知要在btn(展开收缩按钮)中添加。

3K80

android listview更新数据

要使listView的列表项发生改变时及时显示在UI中,就要更新listView数据。...Adapter同步变化;再通过调用adapter.notifyDataSetChanged();方法使得listview界面自动更新。..., strName);//适配器,其中 R.layout.xmlforitem是列表中每一项的布局,可以用默认的可自建,strName则是将数据源绑定到适配器 3、listView.setAdapter...(adapter);//将适配器绑定到列表显示控件ListView; 4、strName.add(“TEST ONE”);//增加一项,引起list变化,Adapter随之变化; 5、adapter.notifyDataSetChanged...();//调用notifyDataSetChanged();更新适配器,ListView会自动刷新,notifyDataSetChanged()方法可能需要在UI线程中调用,建议自行测试; 6、数据增加可能引起内存变化

1.4K20
领券