Android开发之使用BaseAdapter的notifyDataSetChanged()无法更新列表
在做一个通讯录的app,使用BaseAdapter作为adapter。重写了getCount()、getItem()、getItemId() 、getView()方法。
因为新建联系人在第二个activity,所以就把adapter的notifyDataSetChanged()方法放在了第一个activity的生命周期方法onResume()中。但是遇到了bug,就是把新的联系人添加到了数据库,但是返回到第一个activity的时候,listview的显示没有更新。原因是:adapter使用的数据是数据库变更前的数据。当数据库数据变更以后,数据库中的数据已经和内存中的数据不一致了。adapter的notifyDataSetChanged()方法查看到内存中的数据没有更新,所以listview也就不会更新了。
请教了高手怎么处理,目前我能实现的方法就是使用一个广播,在保存数据的时候,发送一个广播,然后在adapter初始化的时候接收广播,假如有广播的话,把内存中的数据清空,然后重新读取数据库的数据。
请看代码:
- public class MyAdapter extends BaseAdapter {
- private List<PhoneBean> lists;
- private Context context;
- public MyAdapter(Context context){
- this.lists = GetPhoneFromSQL.getPhoneInfo(context);
- this.context=context;
- 11 IntentFilter intentFilter = new IntentFilter("com.lijingbo.getmyphonenumber.PHONE_SQL_CHANGED");
- 12 context.registerReceiver(new BroadcastReceiver() {
- 13 @Override
- 14 public void onReceive(Context context, Intent intent) {
- 15 lists.clear();
- 16 lists = GetPhoneFromSQL.getPhoneInfo(context);
- 17 notifyDataSetChanged();
- 18 }
- 19 } , intentFilter);
- 20 }
- @Override
- public int getCount() {
- return lists.size();
- }
- @Override
- public Object getItem(int position) {
- return position;
- }
- @Override
- public long getItemId(int position) {
- return position;
- }
- @Override
- public View getView(int position, View convertView, ViewGroup parent) {
- ViewHolder holder=null;
- if (convertView==null) {
- holder=new ViewHolder();
- convertView=LayoutInflater.from(context).inflate(R.layout.phonedetails, null);
- holder.showName=(TextView) convertView.findViewById(R.id.showName);
- convertView.setTag(holder);
- }else {
- holder=(ViewHolder) convertView.getTag();
- }
- holder.showName.setText(lists.get(position).getName());
- notifyDataSetChanged();
- return convertView;
- }
- static class ViewHolder{
- public TextView showName;
- }
- }
红色字体为新加的广播。
保存数据的部分:
- public class SavePhoneToSQL {
- private static final String DBNAME="Phones";
- private static PhoneBean phoneBean;
- private static DbUtils db;
- static List<PhoneBean> lists ;
- public static void saveData(Context context,String name,String number,String company,String email) {
- phoneBean = new PhoneBean();
- phoneBean.setName(name);
- phoneBean.setNumber(number);
- phoneBean.setCompany(company);
- phoneBean.setCompany(email);
- db = DbUtils.create(context);
- db.configAllowTransaction(true);
- db.configDebug(true);
- try {
- db.createTableIfNotExist(PhoneBean.class);
- } catch (DbException e1) {
- Toast.makeText(context, "创建数据库失败", Toast.LENGTH_SHORT).show();
- }
- try {
- 24 db.save(phoneBean);
- 25 Intent intent = new Intent();
- 26 intent.setAction("com.lijingbo.getmyphonenumber.PHONE_SQL_CHANGED");
- 27 context.sendBroadcast(intent);
- } catch (DbException e) {
- // TODO Auto-generated catch block
- Toast.makeText(context, "数据保存失败", Toast.LENGTH_SHORT).show();
- }
- }
- public static List<PhoneBean> getPhoneInfo() {
- try {
- lists=db.findAll(PhoneBean.class);
- } catch (DbException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return lists;
- }
- }
Android开发之使用BaseAdapter的notifyDataSetChanged()无法更新列表的更多相关文章
- Android 开发环境搭建以及工具(不断更新)
学习android需要学习的编程知识 https://wiki.cyanogenmod.org/w/Doc:_Development_Resources 从http://source.android. ...
- Android开发中常用的库总结(持续更新)
这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...
- [转]Android开发要看的网站(不断更新中)
Android网址或Blog Android官网 身为Android开发者不知道这个网站就太说不过去了,上面有你任何你需要的东西 Android Developers Blog Android官网博客 ...
- Android开发学习——ListView+BaseAdapter的使用
ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据 ----people集合 * V:view视图层,用户看到的界面 ...
- android开发中的BaseAdapter之理解(引用自网络,总结的很好,谢谢)
android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示. BaseAdapter是Android应用程序中经常用到的基 ...
- Android开发——利用Cursor+CursorAdapter实现界面实时更新
好久没有更新博客了.不是没时间写,而是太懒.而且感觉有些东西没有时间总结,之之后再想写,就想不起来了.晚上新发现一点东西,所以就及时写下来. 最近利用业余时间在看Android的Download模块, ...
- Android开发UI之在子线程中更新UI
转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代 ...
- Android开发 - 下拉刷新和分段头悬停列表
项目源码 本文所述项目已开源,源码地址 为什么做PullToRefresh-PinnedSection-ListView 前段时间因为项目需求,需要在Android中对ListView同时增加下拉刷新 ...
- Android开发 ViewPager删除Item后,不会更新数据和View
问题描述: 在使用ViewPager的适配器删除适配器里一个Item后依然会,而删除的这个item依然会保留缓存,适配器不会重新加载更新数据.如下代码: public class TReleaseCi ...
随机推荐
- ios 经典错误
1 - [person test]:unrecognized selector sent to instance. 给penson对象发送一个不能识别的消息:test 2 set/get方法死循环 ...
- Sublime Text3一些安装和使用技巧
ST3是一款很好的编辑软件,他不仅仅是能编辑前端代码,包括JS,PHP,HTML,CSS等,还能编辑JAVA,C++等常用后代编辑语言.因为本人写前端,本篇文章只介绍ST3的一些前端的技巧. 对于ST ...
- Oracle PL/SQL 事物处理 银行转账
Oracle数据库中的事务处理:添加,修改,删除时需要使用事务处理(显示事务). 1.事务的分类显示事务(添加,修改,删除)和隐式事务(除了添加,修改,删除). 2.事务的执行方式:自动提交(jdbc ...
- MFC通过ADO操作Access数据库
我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...
- JEECG开发总结
一:datagrid列表 (1)时间:<t:dgCol title="创建时间" field="createtime" width="60&qu ...
- Ajax跨域请求——PHP服务端处理
header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...
- 解决ie8下h5元素兼容性的问题
HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ...
- 一个空格也可以让html格式显示大不相同
今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...
- jQuery实现鼠标移到元素上动态提示消息框效果
当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...
- 解决laravel中环境配置不起作用的方法
博客已经迁移到www.imyzf.com,本站不再更新,请谅解! laravel有个环境配置选项很好用,在bootstrap/start.php中,曾经百度到这里面加入域名,就可以自动选择环境 $en ...