关于调用notifyDataSetChanged刷新PullToRefreshListView列表无反应解决办法

2015-11-17 16:48 阅读 9,830 次 评论 0 条

摘要:

做新闻列表的时候,经常通过调用BaseAdapter中提供的notifyDataSetChanged方法来刷新列表,这个时候出现刷新列表后,ListView列表数据无变化的情况,出现这个结果的原因是给同一个List对象赋予了不同的引用,解决的办法是调用List中的add方法,将需要添加的数据再加入到List对象中,问题解决。
演示Demo

关键代码:

  1. //从后台获取到的数据,以实体形式存储到List中  
  2. private List<NewsMessageBean> entrysList = new ArrayList<NewsMessageBean>();  
  3. //默认获取第一页数据,下拉刷新获取第二页、第三页  
  4. private int page_id=1;  
  5.   
  6. private void getNewsMainListDataByThree(String categoryId, String rows,String offset, String direction) {  
  7.   
  8. NewsMainGetDataListAPI.getNewsListNearBy(categoryId, rows, offset,direction, new HttpResponseHandler(getActivity(), false) {  
  9.   
  10. @Override  
  11. public void doSuccess(boolean isSuccess, String json) {  
  12.   
  13. if (isSuccess) {  
  14.    /** 
  15.     * 加载第一页数据 
  16.     */  
  17.    if (page_id == 1) {  
  18.         entrysList = GsonUtil.jsonArray2List(json,NewsMessageBean.class);  
  19.   
  20.     if (entrysList.size() <= 0) {  
  21.         NothingListViewAdapter noAdapter = new NothingListViewAdapter(getActivity());  
  22.         FreshMansListView(noAdapter);  
  23.     }  
  24.   
  25.     new Thread() {  
  26.       @Override  
  27.       public void run() {  
  28.         Message message = new Message();  
  29.         message.what = REFRESH_NEWS_CONTENT;  
  30.         handler.sendMessage(message);  
  31.         }  
  32.      }.start();  
  33.      }  
  34.   
  35. /** 
  36.  * 如果下拉刷新了ListView列表,或者下拉加载了列表 
  37.  */  
  38. List<NewsMessageBean> entrysListNews = GsonUtil.jsonArray2List(json, NewsMessageBean.class);  
  39.   
  40.    if (entrysListNews.size() <= 0) {  
  41.     NothingListViewAdapter noAdapter = new NothingListViewAdapter(getActivity());  
  42.     FreshMansListView(noAdapter);  
  43.    }  
  44.   
  45. // 最关键的一步,如果你是这样写:entrysList=entrysListNews,列表数据不刷新,应该通过add方法,添加数据到同一个entrysList中  
  46.   
  47. Iterator<NewsMessageBean> iter = entrysListNews.iterator();  
  48.   
  49.        while (iter.hasNext()) {  
  50.         entrysList.add(iter.next());}  
  51.         }  
  52. }  
  53.   
  54. });  
  55.   
  56. }  

刷新列表代码:

  1. private void setNewsAdatpers() {  
  2.     if (null != adapter) {  
  3.         adapter.notifyDataSetChanged();  
  4.     } else {  
  5.         adapter = new HotNewsMainListAdapter(entrysList, getActivity());  
  6.         FreshMansListView(adapter);//这个方法添加适配器  
  7.     }  
  8. }  

分析:

在上面的List对象entrysList中,我们刷新ListView的时候,不是直接将新获取的entrysListNews直接赋值给entrysList,而是通过遍历entrysListNews后将每个NewsMessageBean添加到原来的entrysList对象中,这样在adapter调用notifyDataSetChanged方法,就可以刷新ListView列表数据。直接将entrysListNews直接赋值给entrysList后,演示demo如下图:
无刷新演示Demo

你可能感兴趣的文章

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处: https://www.teachcourse.cn/792.html ,谢谢支持!

资源分享

Android学习笔记十三:性能优化 Android学习笔记十三:性能优化
ViewPager+FragmentPagerAdapter实现简单新闻客户端 ViewPager+FragmentPagerAd
重置路由器电脑网络显示黄色叹号怎么办? 重置路由器电脑网络显示黄色叹号
盘点2018年,那些做过的事情 盘点2018年,那些做过的事情