在做一个通讯录的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()无法更新列表的更多相关文章

  1. Android 开发环境搭建以及工具(不断更新)

    学习android需要学习的编程知识 https://wiki.cyanogenmod.org/w/Doc:_Development_Resources 从http://source.android. ...

  2. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  3. [转]Android开发要看的网站(不断更新中)

    Android网址或Blog Android官网 身为Android开发者不知道这个网站就太说不过去了,上面有你任何你需要的东西 Android Developers Blog Android官网博客 ...

  4. Android开发学习——ListView+BaseAdapter的使用

    ListView 就是用来显示一行一行的条目的MVC结构 * M:model模型层,要显示的数据           ----people集合 * V:view视图层,用户看到的界面          ...

  5. android开发中的BaseAdapter之理解(引用自网络,总结的很好,谢谢)

    android中的适配器(Adapter)是数据与视图(View)之间的桥梁,用于对要显示的数据进行处理,并通过绑定到组件进行数据的显示. BaseAdapter是Android应用程序中经常用到的基 ...

  6. Android开发——利用Cursor+CursorAdapter实现界面实时更新

    好久没有更新博客了.不是没时间写,而是太懒.而且感觉有些东西没有时间总结,之之后再想写,就想不起来了.晚上新发现一点东西,所以就及时写下来. 最近利用业余时间在看Android的Download模块, ...

  7. Android开发UI之在子线程中更新UI

    转自第一行代码-Android Android是不允许在子线程中进行UI操作的.在子线程中去执行耗时操作,然后根据任务的执行结果来更新相应的UI控件,需要用到Android提供的异步消息处理机制. 代 ...

  8. Android开发 - 下拉刷新和分段头悬停列表

    项目源码 本文所述项目已开源,源码地址 为什么做PullToRefresh-PinnedSection-ListView 前段时间因为项目需求,需要在Android中对ListView同时增加下拉刷新 ...

  9. Android开发 ViewPager删除Item后,不会更新数据和View

    问题描述: 在使用ViewPager的适配器删除适配器里一个Item后依然会,而删除的这个item依然会保留缓存,适配器不会重新加载更新数据.如下代码: public class TReleaseCi ...

随机推荐

  1. STL的简介

    Standard Template Library,(标准模板库)<来自百度百科的整理> ————可复用性(reusability) STL是基于模板,内联函数的使用使得生成的代码短小高效 ...

  2. 九度OJ 1447 最短路 1008 最短路径问题

    题目地址:http://ac.jobdu.com/problem.php?pid=1447 题目描述: 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上 ...

  3. lsof作用

    lsof 卸载移动存储时经常提示device busy,也可能误删了一个正在打开的文件....  这时候可以试试lsof  lsof简介 lsof(list open files)是一个列出当前系统打 ...

  4. 用LinqToExcel处理有标题表格的数据

    1. 先根据表格标题定义一个类. public class News { public string Title { set; get; } public string Content { set; ...

  5. js模拟苹果菜单

    模拟苹果菜单的js代码是从网上看到的,用来做导航菜单还是蛮好看的.这里借鉴一下. 效果描述:当鼠标移动离哪个图片最近的时候,这个图片最大,鼠标离的图片越远,则图片越小: 原理:主要用到了三角形的勾股定 ...

  6. Modernizr.js介绍与使用

    Modernizr帮助我们检测浏览器是否实现了某个feature,如果实现了那么开发人员就可以充分利用这个feature做一些工作,反之没有实现开发人员也好提供一个fallback.所以,我们要明白的 ...

  7. 解决使用 Composer 的时候提示输入 Token

    Could not fetch https://api.github.com/repos/RobinHerbots/jquery.inputmask/contents/bower.json?ref=0 ...

  8. js简单实现删除记录时的提示效果

    删除记录时的提示效果,挺人性化的,实现的方法有很多,在本文为大家介绍下使用js是如何实现的 样式 复制代码代码如下: <style type="text/css">  ...

  9. ECshop网店系统百万级商品量性能优化-加快首页访问速度

    如果ECshop的商品数达到几万,十几万的时候,如果首页没有缓存,第一次访问的时候,你会发现其慢无比,原因就是清空了Cache后或者没有Cache的情况下,ECshop会Bulid一些Cache数据, ...

  10. 将TIBCO Host 实例注册为Windows服务

    安装了TIBCO ActiveMatrix BPM及成功创建了ActiveMatrix Administrator 和 BPM Server后,每次都要手动启动tibcohost,比较麻烦,实际上TI ...