在做一个通讯录的app,使用BaseAdapter作为adapter。重写了getCount()、getItem()、getItemId() 、getView()方法。

因为新建联系人在第二个activity,所以就把adapter的notifyDataSetChanged()方法放在了第一个activity的生命周期方法onResume()中。但是遇到了bug,就是把新的联系人添加到了数据库,但是返回到第一个activity的时候,listview的显示没有更新。原因是:adapter使用的数据是数据库变更前的数据。当数据库数据变更以后,数据库中的数据已经和内存中的数据不一致了。adapter的notifyDataSetChanged()方法查看到内存中的数据没有更新,所以listview也就不会更新了。

请教了高手怎么处理,目前我能实现的方法就是使用一个广播,在保存数据的时候,发送一个广播,然后在adapter初始化的时候接收广播,假如有广播的话,把内存中的数据清空,然后重新读取数据库的数据。

请看代码:

  1. public class MyAdapter extends BaseAdapter {
  2.  
  3. private List<PhoneBean> lists;
  4. private Context context;
  5.  
  6. public MyAdapter(Context context){
  7.  
  8. this.lists = GetPhoneFromSQL.getPhoneInfo(context);
  9. this.context=context;
  10.  
  11. 11 IntentFilter intentFilter = new IntentFilter("com.lijingbo.getmyphonenumber.PHONE_SQL_CHANGED");
  12. 12 context.registerReceiver(new BroadcastReceiver() {
  13. 13 @Override
  14. 14 public void onReceive(Context context, Intent intent) {
  15. 15 lists.clear();
  16. 16 lists = GetPhoneFromSQL.getPhoneInfo(context);
  17. 17 notifyDataSetChanged();
  18. 18 }
  19. 19 } , intentFilter);
  20. 20 }
  21.  
  22. @Override
  23. public int getCount() {
  24. return lists.size();
  25. }
  26.  
  27. @Override
  28. public Object getItem(int position) {
  29. return position;
  30. }
  31.  
  32. @Override
  33. public long getItemId(int position) {
  34. return position;
  35. }
  36.  
  37. @Override
  38. public View getView(int position, View convertView, ViewGroup parent) {
  39. ViewHolder holder=null;
  40. if (convertView==null) {
  41. holder=new ViewHolder();
  42. convertView=LayoutInflater.from(context).inflate(R.layout.phonedetails, null);
  43. holder.showName=(TextView) convertView.findViewById(R.id.showName);
  44. convertView.setTag(holder);
  45. }else {
  46. holder=(ViewHolder) convertView.getTag();
  47. }
  48. holder.showName.setText(lists.get(position).getName());
  49. notifyDataSetChanged();
  50. return convertView;
  51. }
  52.  
  53. static class ViewHolder{
  54. public TextView showName;
  55. }
  56.  
  57. }

红色字体为新加的广播。

保存数据的部分:

  1. public class SavePhoneToSQL {
  2.  
  3. private static final String DBNAME="Phones";
  4. private static PhoneBean phoneBean;
  5. private static DbUtils db;
  6. static List<PhoneBean> lists ;
  7.  
  8. public static void saveData(Context context,String name,String number,String company,String email) {
  9. phoneBean = new PhoneBean();
  10. phoneBean.setName(name);
  11. phoneBean.setNumber(number);
  12. phoneBean.setCompany(company);
  13. phoneBean.setCompany(email);
  14.  
  15. db = DbUtils.create(context);
  16. db.configAllowTransaction(true);
  17. db.configDebug(true);
  18. try {
  19. db.createTableIfNotExist(PhoneBean.class);
  20. } catch (DbException e1) {
  21. Toast.makeText(context, "创建数据库失败", Toast.LENGTH_SHORT).show();
  22. }
  23. try {
  24. 24 db.save(phoneBean);
  25. 25 Intent intent = new Intent();
  26. 26 intent.setAction("com.lijingbo.getmyphonenumber.PHONE_SQL_CHANGED");
  27. 27 context.sendBroadcast(intent);
  28. } catch (DbException e) {
  29. // TODO Auto-generated catch block
  30. Toast.makeText(context, "数据保存失败", Toast.LENGTH_SHORT).show();
  31. }
  32.  
  33. }
  34.  
  35. public static List<PhoneBean> getPhoneInfo() {
  36. try {
  37. lists=db.findAll(PhoneBean.class);
  38. } catch (DbException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. }
  42. return lists;
  43. }
  44. }

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. ios 经典错误

    1 - [person test]:unrecognized selector sent to instance. 给penson对象发送一个不能识别的消息:test   2 set/get方法死循环 ...

  2. Sublime Text3一些安装和使用技巧

    ST3是一款很好的编辑软件,他不仅仅是能编辑前端代码,包括JS,PHP,HTML,CSS等,还能编辑JAVA,C++等常用后代编辑语言.因为本人写前端,本篇文章只介绍ST3的一些前端的技巧. 对于ST ...

  3. Oracle PL/SQL 事物处理 银行转账

    Oracle数据库中的事务处理:添加,修改,删除时需要使用事务处理(显示事务). 1.事务的分类显示事务(添加,修改,删除)和隐式事务(除了添加,修改,删除). 2.事务的执行方式:自动提交(jdbc ...

  4. MFC通过ADO操作Access数据库

    我在<VC知识库在线杂志>第十四期和第十五期上曾发表了两篇文章——“直接通过ODBC读.写Excel表格文件”和“直接通过DAO读.写Access文件”,先后给大家介绍了ODBC和DAO两 ...

  5. JEECG开发总结

    一:datagrid列表 (1)时间:<t:dgCol title="创建时间" field="createtime" width="60&qu ...

  6. Ajax跨域请求——PHP服务端处理

    header('Access-Control-Allow-Origin:*'); // 响应类型 header('Access-Control-Allow-Methods:POST'); // 响应头 ...

  7. 解决ie8下h5元素兼容性的问题

    HTML5的语义化标签以及属性,可以让开发者非常方便地实现清晰的web页面布局,加上CSS3的效果渲染,快速建立丰富灵活的web页面显得非常简单. HTML5的新标签元素有: <header&g ...

  8. 一个空格也可以让html格式显示大不相同

    今天在编写html时出现了bug,有两个标签一直贴近显示,但是两段代码完全一样前一段就没有问题. 错误代码如下 <div id="tool1" style="wid ...

  9. jQuery实现鼠标移到元素上动态提示消息框效果

    当光标移动到某些元素上时,会弹出像tips的提示框,这种效果想必大家都有见到过吧,下面有个不错的示例,大家可以感受下 当光标移动到某些元素上时,会弹出像tips的提示框. 复制代码代码如下: < ...

  10. 解决laravel中环境配置不起作用的方法

    博客已经迁移到www.imyzf.com,本站不再更新,请谅解! laravel有个环境配置选项很好用,在bootstrap/start.php中,曾经百度到这里面加入域名,就可以自动选择环境 $en ...