都用过 BaseAdapter的notifyDataSetChanged()方法,用法很简单,当BaseAdapter的数据更新了,需要更改显示,这时候就要调用notifyDataSetChanged(...从Adapter的源码中不难看出,关于数据更新的代码只有两个函数: public interface Adapter { /** * Register an observer that is called...调用NotifyDataSetChanged就是调用了这个类的onChanged()函数,细看以下AdapterDataSetObserver 的onChanged函数,发现,其实这个函数并没有什么奇特的写法...中有四个数据更新相关的函数: 其实我们很容易发现,这两个函数仅仅是调用了BaseAdapter函数的内部成员变量的的notifyInvalidated()函数和notifyChanged()函数,而这个成员变量则是通...requestLayout();熟悉这个函数的都知道,这个函数的调用会让子控件,也就是当前的ListView重新向父控件请求layout。
在我们使用 ListView 的过程中,经常需要修改 Item 的状态,比如添加、删除、选中等等,通常的操作是在对数据源进行操作后,调用 notifyDataSetChanged() ,比如:...= null) { mData.add(data); notifyDataSetChanged(); } } 随后 ListView...1.首先我们跟进去看下 notifyDataSetChanged() 源码,进入了系统的 BaseAdapter: /** * Notifies the attached observers...DataSetObserver observer) { mDataSetObservable.unregisterObserver(observer); } /** * 数据更新时通知观察者...ListView 注册观察者 流程图 : ? ListView 通知观察者更新 流程图 : ?
Android源码中的应用 在以前,我们最常用到的控件就是ListView了,而ListView最重要的一个点就是Adapter,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged...跟进这个方法notifyDataSetChanged方法,这个方法定义在BaseAdapter中,代码如下: public abstract class BaseAdapter implements ListAdapter...当ListView的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者...而Adapter中包含一个数据集可观察者DataSetObservable,在数据数量发生变更时开发者手动调用Adapter.notifyDataSetChanged,而notifyDataSetChanged...在AdapterDataSetObserver的onChanged函数中会获取Adapter中数据集的新数量,然后调用ListView的requestLayout()方法重新进行布局,更新用户界面。
接下来通过一个简单的示例程序来学习ListView的数据更新。...="wrap_content" /> 由于当ListView没有数据时,整个页面一片白,非常难看,所以加了一个文本框,当列表没有数据时提示用户。...提供Adapter,使用自定义的BaseAdapter决定ListView所要显示的列表项,然后为4个按钮设置监听监听器。...再点击删除按钮,可以看到将会从列表中删除随机列表项,如上图右侧所示。 点击清空按钮,可以将列表所有数据全部清空,显示启动时的页面。...从以上几个操作,可以看到动态更新时离不开每次调用notifyDataSetChanged()方法,这个方法的主要作用就是当适配器里面的内容发生改变时需要强制调用getView()方法来刷新每个Item的内容
在我们Android 开发中,ListView是在常用不过的控件了。但是有时候会爆出这种异常,就搞得好尴尬了。...异常图片 明明我们在代码中的确是有调用adaptor.notifyDataSetChanged()这个方法的,明显没问题啊。...我们在adaptor内部就封装了一个List用于保存用户传过来的List数据,我们这里只是对外部的list有一个引用,但是真正使用到的list,却是内部的List,通过每一次调用notifyDataSetChanged...再调用父类的更新、这样,我们玩来玩去就是外部的list,并不会对内部listview使用到的list有任何影响。就完美屏蔽了这个异常了。...另外 分享一句我最喜欢的歌词: 如果那两个字没有颤抖 我不会发现我难受 怎么说出口也不会是分手 如果对于明天没有要求 牵牵手就像旅游(女友) 成千上万个门口 总有一个人要先走 怀抱既然不能逗留
,数据库增加一条记录,参数:String电话号码,String拦截模式 此时ListView并不会显出出来刚添加的记录,需要退出这个Activity重写进入,我们通知适配器数据更新 调用集合List对象的...add()方法,添加一条数据,参数:0(第一个),数据 调用ListAdapter对象的notifyDataSetChanged()方法,通知数据更新 删除记录 条目布局文件中,在右侧放置一个垃圾桶的小图标...时,它所在的包是DialogInterface.OnClickListener 调用之前定义好的Dao类BlackNumberAdo对象的delete()方法,参数:String电话号码 调用集合List...对象的remove()方法,删除一条数据,参数:int索引 调用ListAdapter对象的notifyDataSetChanged()方法,通知数据更新 CallSmsSafeActivity.java...public TextView modeView; public ImageView iv_delete; } private class MyAdapter extends BaseAdapter
抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。...了,而ListView最重要的一个点就是Adapter,在我们往ListView添加数据后,我们都会调用一个方法: notifyDataSetChanged(), 这个方法就是用到了我们所说的观察者模式...跟进这个方法notifyDataSetChanged方法,这个方法定义在BaseAdapter中,代码如下: public abstract class BaseAdapter implements ListAdapter...而Adapter中包含一个数据集可观察者DataSetObservable,在数据数量发生变更时开发者手动调用AdapternotifyDataSetChanged,而notifyDataSetChanged...从而使得各自的变化都不会影响另一边的变化。 缺点 依赖关系并未完全解除,抽象通知者依旧依赖抽象的观察者。 适用场景 当一个对象的改变需要给变其它对象时,而且它不知道具体有多少个对象有待改变时。
使用ViewHolder模式提高效率 ViewHolder模式充分利用了ListView的视图缓存机制,避免了每次在getView()时重复的调用findViewById()....需要显示一行时,它会调用此方法 @Override public View getView(int position, View convertView, ViewGroup parent...我们可以通过scrollbars属性来控制ListView的滚动状态。特别的,当scrollbars设置为none时,ListView无论滚动还是不滚动,就都不会出现滚动条了。...动态修改ListView-notifyDataSetChanged notifyDataSetChanged mData.add("new"); notifyDataSetChanged(); 当修改了传递给...Adapter的映射List之后,只需要通过调用Adapter的notifyDataSetChanged方法,通知ListView更改数据源即可完成对ListView的动态修改。
执行完container.removeView((View) object)后,可以使用一个List来维护回收的View,这样可以避免创建大量的View对象——就像ListView的BaseAdapter...ViewPager和PagerAdapter关联同步 ViewPager和PagerAdapter的关系就如同ListView和BaseAdapter的关系,是视图和视图数据适配器的关系——满满都是模式...PagerAdapter的notifyDataSetChanged并不像它应该承诺的那样,而为了实现在Adapter数据发生变化后通知更新ViewPager的目的:需要再次执行viewPager.setAdapter...关于viewPager设计的吐槽 ViewPager显然是按照了ListView那样的方式来计算总页数的,但是对于一个每次只显示3页的View来说,每次左滑和右滑的时候调用一个让子类重写的判断是否还有左边...这里强调的是:既然ViewPager每次只展示最多3个page,而且左右滑动的逻辑可以在每次滑动时进行检查,那么对于任意大的数据集合,它都应该不会卡顿。
在Android开发中我们经常会用到listview的数据和界面刷新动作,我们每次可能会用到的都是Adapter.notifyDataSetChanged()方法。...listview时调用了多次,在点击更新界面的时候只调用了一次。...,调用一次getView()方法;Google推荐的做法 * * @param listView 要更新的listview * @param position 要更新的位置...notifyDataSetChanged(ListView listView, int position),传入对应的要更新的listview和要更新的位置position即可 7.总结 这三种方法的核心就是找出你要更新...因为ListView默认只会加载一屏的数据,所以要判断其可见范围。不可见的在滑动的时候getView会自动调用更新数据。
2.实例(订阅杂志) /** * 抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己 */ public interface Observer { /** * 有更新就推送消息...} 3.源码体现(BaseAdapter的notifyDataSetChanged) public abstract class BaseAdapter implements ListAdapter,...下面的代码显示,是调用了registerObserver方法。...该方法在BaseAdapter的registerDataSetObserver调用的 public abstract class Observable { protected final...下面的代码显示是ListView等控件setAdapter调用的 @Override public void setAdapter(ListAdapter adapter) {
ListView是我们开发中很重要的控件,在项目中也用的非常多,为了利用ListView展示数据,我们都需要给它新建一个适配器Adapter,一般继承于BaseAdapter,然后重写一些方法,其中最重要的方法是...view.setOnClickListener(listener); return this; } 这里我们所有的set方法都返回ViewHolderHelper对象本身,这样做的好处就是如果我们要调用多次这样的...AdapterBase 我们下面来实现AdapterBase,继承与BaseAdapter public abstract class AdapterBase extends BaseAdapter...接下来我们重写ListAdapter的分组方法,毕竟还是有很多时候ListView的cell样式不止一种。...convert接口对我们的ListView cell进行定制填充。
ListView 针对每个item,要求 adapter“返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView...的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。...但是当xml文件被解析的时候,只要被创建出来了,其孩子的id就不会改变了。根据这个特点,可以将孩子id存入到指定的集合中,每次就可以直接取出集合中对应的元素就可以了。...分发到listview,但是页面往上拉时依然会有问题。...为了解决这个问题(如何将事件消费从listview转到scrollview,就是子传父)我考虑过return true将事件消费掉,但是dispatchTouchEvent两者都会调用,不能这么做。
2、定义了一个数据观察者AdapterDataSetObserver,用于在列表数据发生变化时,可以通过notifyDataSetChanged方法来更新视图。...像ListView和GridView一般都是直接使用BaseAdapter,并不使用布局过于简单的SimpleAdapter。...但实际开发中发现这个设置不起作用,即使该属性设置为true,开头也不会显示分隔线。查看ListView的源码,发现分隔线是画在子视图的下方,所以列表上方的分隔线就画不出来了。...; 2、不管是否指定headerDividersEnabled,列表上方的分隔线都不会显示; ListView的使用方式 Android提供了两种使用ListView的方式: 1、ListActivity...该方式要从布局文件中获取ListView的对象,然后调用该对象的setAdapter方法设置适配器,并调用ListView对象的setOnItemClickListener方法来设置点击事件的监听器。
在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法: 1、重新给ListView组件设置适配器 这种方法重新创建了ListView,效率不好。.... */ public void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); } 这种方法旨在告知适配器...,ListView中的数据源发生变化,需要重新加载新的数据,不会重新创建ListView。...使用此方法时,需要确保使用的是同一数据存储对象,只是存储对象中的值发生变化,才能使改动生效。...* * ListView演示Demo中的数据适配器 */ public class ListViewDemoAdapter extends BaseAdapter { private
import java.util.List; import mus.cn.expandablelistviewdemo.R; public class MyGVAdapter extends BaseAdapter...再 去除全部数据放在listRow中,同时调用myGVAdapter.notifyDataSetChanged();这里也可以直接把listDataAll传进去,但传进去还要再new一个适配器,这就不如直接...notifyDataSetChanged()了。...//tab居中显示 tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER); //tab的字体选择器,默认黑色,选择时红色...myGVAdapter2.notifyDataSetChanged();这里只通知listview就可以了,GV通知要在btn(展开收缩按钮)中添加。
notifyDataSetChanged。...在退出使用ViewPager的界面时,记得在退出之前调用其removeAllViews方法,避免频繁进出该界面时内存不断上涨; 参考链接 PagerSlidingTabStrip介绍及使用,让ViewPager...更绚丽 PagerSlidingTabStrip Android ListView控件的用法 listView是一个可以用来显示视图列表的控件。...类 使用ArrayAdapter类 继承BaseAdapter并重写其中的方法。...调用ListView类型对象的.setAdapter方法,把mListViewAdapter对象设置为mListView的适配器 调用mListView的监听方法设置各种监听事件:.setOn… SimpleAdapter
notifyDataSetChanged失效的问题 。...但是使用中发现,在删除或者修改数据的时候,PagerAdapter无法像BaseAdapter那样仅通过notifyDataSetChanged方法通知刷新View。...存在的问题: 这不是PagerAdapter中的Bug,通常情况下,调用notifyDataSetChanged方法会让ViewPager通过Adapter的getItemPosition方法查询一遍所有...更有效地方法: 更为靠谱的方法是因地制宜,根据自己的需求来实现notifyDataSetChanged的功能,比如,在仅需要对某个View内容进行更新时,在instantiateItem()时,用View.setTag...方法加入标志,在需要更新信息时,通过findViewWithTag的方法找到对应的View进行更新即可。
android:footerDividersEnabled:当设置为false时, ListView不会在每个页脚视图之前绘制分隔符。...android:headerDividersEnabled:当设置为false时, ListView不会在每个标题视图之后绘制分隔符。...ListView的数据适配器数据 commodityAdapter.notifyDataSetChanged(); } } 5....的缓存机制,而且使用 ViewHolder类来实现显示数据视图的缓存,避免多次调用 findViewById来寻找控件,以达到优化程序的目的。...点击该 gridview中的某个 item时,会显示橘黄色的显示背景(android系统默认设置颜色),若想设置点击时无色(透明色,不用系统背景色),并设置自己的点击效果,只需将上述设置成:android
基本原理 上拉加载或者说滚动到底部时自动加载,都是通过判断是否滚动到了ListView或者其他View的底部,然后触发相应的操作,这里我们以 ListView来说明。...因此我们需要在监听ListView的滚动事件,当ListView滚动到底部时自动触发加载操作;但是当用户支持手指滑动屏 幕,没有滚动时,我们也需要让它加载,因此这种情形就是上拉加载更多。...= 0; i < 20; i++) { datas.add("item - " + i); } // 构造适配器 final BaseAdapter...(); // 更新完后调用该方法结束刷新 myRefreshListView.setRefreshing(...(); // 加载完后调用该方法 myRefreshListView.setLoading(false);
领取专属 10元无门槛券
手把手带您无忧上云