众所周知Listview和Gridview的刷新界面的方式是调用adapter.notifyDataSetChanged()进行界面刷新。

但是此方法有其弊端,他是将界面中的数据全部刷新一遍,不论数据有没有变化。如果listview加载了很多的数据(如:100条)

在进行刷新时就会造成很大的系统开销如何像qq空间个人动态那样点赞只刷新一条呢:

主要原理:

对listview的某一个item进行刷新

1.要获取要刷新的item当前索引position和数据

2.对获取的数据进行重置

3.将重置的数据放到adapter中的数据集的原来的位置(根据position刷新原数据集的某一条数据)

4.在listview中获取需要刷新的子item的view

5.从更新过的数据集中获取新数据,更新viwe中的数据(handler中操作,实现界面的刷新)

功能如下,代码中有详细注释:

  1. public class MainActivity extends Activity
  2. {
  3. private ArrayList<MyListItem> list = null;
  4. private ListView              lv;
  5. private MyListAdapter         adapter;
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState)
  8. {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. intitData();
  12. lv = (ListView) findViewById(R.id.listView1);
  13. adapter = new MyListAdapter(list, getApplicationContext());
  14. adapter.setListView(lv);
  15. lv.setAdapter(adapter);
  16. lv.setOnItemClickListener(new OnItemClickListener()
  17. {
  18. @Override
  19. public void onItemClick(AdapterView<?> parent, View view, int position, long id)
  20. {
  21. // 获取listview中点击item的数据
  22. MyListItem item = (MyListItem) parent.getItemAtPosition(position);
  23. Log.i("eee", item.getData() + " == " + item.getPosition());
  24. // 更新数据
  25. item.setData("update item " + position);
  26. // 更新界面
  27. adapter.updateItemData(item);
  28. }
  29. });
  30. }
  31. /**
  32. * 初始化数据
  33. */
  34. private void intitData()
  35. {
  36. list = new ArrayList<MyListItem>();
  37. for (int i = 0; i < 20; i++)
  38. {
  39. MyListItem item = new MyListItem();
  40. item.setData("item " + i);
  41. item.setPosition(i);
  42. list.add(item);
  43. }
  44. }
  45. /**
  46. * 自定义item数据类型
  47. */
  48. class MyListItem
  49. {
  50. /**
  51. * 数据id
  52. */
  53. private int    dataId;
  54. /**
  55. * 数据
  56. */
  57. private String data;
  58. public int getPosition()
  59. {
  60. return dataId;
  61. }
  62. public void setPosition(int position)
  63. {
  64. this.dataId = position;
  65. }
  66. public String getData()
  67. {
  68. return data;
  69. }
  70. public void setData(String data)
  71. {
  72. this.data = data;
  73. }
  74. }
  75. }

activity进行调用,功能操作主要封装在adapter中如下:

  1. public class MyListAdapter extends BaseAdapter
  2. {
  3. /**
  4. * listview中的数据集
  5. */
  6. private ArrayList<MyListItem> mDataList;
  7. private Context               mContext;
  8. private ListView              mListView;
  9. public MyListAdapter(ArrayList<MyListItem> list, Context cont)
  10. {
  11. this.mDataList = list;
  12. this.mContext = cont;
  13. }
  14. /**
  15. * 设置listview对象
  16. *
  17. * @param lisv
  18. */
  19. public void setListView(ListView lisv)
  20. {
  21. this.mListView = lisv;
  22. }
  23. /**
  24. * update listview 单条数据
  25. *
  26. * @param item 新数据对象
  27. */
  28. public void updateItemData(MyListItem item)
  29. {
  30. Message msg = Message.obtain();
  31. int ids = -1;
  32. // 进行数据对比获取对应数据在list中的位置
  33. for (int i = 0; i < mDataList.size(); i++)
  34. {
  35. if (mDataList.get(i).getPosition() == item.getPosition())
  36. {
  37. ids = i;
  38. }
  39. }
  40. msg.arg1 = ids;
  41. // 更新mDataList对应位置的数据
  42. mDataList.set(ids, item);
  43. // handle刷新界面
  44. han.sendMessage(msg);
  45. }
  46. @SuppressLint("HandlerLeak")
  47. private Handler han = new Handler()
  48. {
  49. public void handleMessage(android.os.Message msg)
  50. {
  51. updateItem(msg.arg1);
  52. };
  53. };
  54. /**
  55. * 刷新指定item
  56. *
  57. * @param index item在listview中的位置
  58. */
  59. private void updateItem(int index)
  60. {
  61. if (mListView == null)
  62. {
  63. return;
  64. }
  65. // 获取当前可以看到的item位置
  66. int visiblePosition = mListView.getFirstVisiblePosition();
  67. // 如添加headerview后 firstview就是hearderview
  68. // 所有索引+1 取第一个view
  69. // View view = listview.getChildAt(index - visiblePosition + 1);
  70. // 获取点击的view
  71. View view = mListView.getChildAt(index - visiblePosition);
  72. TextView txt = (TextView) view.findViewById(R.id.textView1);
  73. // 获取mDataList.set(ids, item);更新的数据
  74. MyListItem data = (MyListItem) getItem(index);
  75. // 重新设置界面显示数据
  76. txt.setText(data.getData());
  77. }
  78. @Override
  79. public int getCount()
  80. {
  81. // TODO Auto-generated method stub
  82. return mDataList.size();
  83. }
  84. @Override
  85. public Object getItem(int position)
  86. {
  87. // TODO Auto-generated method stub
  88. return mDataList.get(position);
  89. }
  90. @Override
  91. public long getItemId(int position)
  92. {
  93. // TODO Auto-generated method stub
  94. return position;
  95. }
  96. @Override
  97. public View getView(int position, View convertView, ViewGroup parent)
  98. {
  99. // TODO Auto-generated method stub
  100. if (convertView == null)
  101. {
  102. convertView = LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
  103. }
  104. TextView txt = (TextView) convertView.findViewById(R.id.textView1);
  105. txt.setText(mDataList.get(position).getData());
  106. return convertView;
  107. }
  108. }

由于listview与gridview功能相似,只是显示方式不同,原理一样,需要的同学可以自己修改一下试试

源码下载

android Listview,gridview局部刷新,部分刷新的更多相关文章

  1. android ListView的上部下拉刷新下部点击加载更多具体实现及拓展

    android ListView的上部下拉刷新下部点击加载更多具体实现及拓展 ListView下拉刷新,上拉自动加载更多 下拉刷新以及加载更多

  2. android listview用adapter.notifyDataSetChanged()无法刷新每项的图标

    http://blog.csdn.net/caizhegnhao/article/details/41318575 今天在开发中遇到一个很奇怪的listview的问题. 这个问题情景是我的应用需要做一 ...

  3. 【转载】 Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

    Android下拉刷新pullToRefreshListViewGridView 转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/3 ...

  4. Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:[张鸿洋的博客] 群里一哥们今天聊天偶然提到这个git ...

  5. Android PullToRefresh (ListView GridView 下拉刷新) 使用详解 (转载)

    最近项目用到下拉刷新,上来加载更多,这里对PullToRefresh这控件进行了解和使用. 以下内容转载自:http://blog.csdn.net/lmj623565791/article/deta ...

  6. android:ListView的局部刷新

    1.简介 对于android中的ListView刷新机制,大多数的程序员都是很熟悉的,修改或者添加adapter中的数据源之后,然后调用notifyDataSetChanged()刷新ListView ...

  7. Android listview局部刷新和模拟应用下载(zhu)

    在android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用notifyDataSetChanged()这个函数,但是它会更新listview中所有可 ...

  8. Android研究之手PullToRefresh(ListView GridView 下拉刷新)使用具体解释

     群里一哥们今天聊天偶然提到这个git hub上的控件:pull-to-refresh ,有兴趣的看下,样例中的功能极其强大,支持非常多控件.本篇博客具体给大家介绍下ListView和GridVi ...

  9. 【转】Android PullToRefresh (ListView GridView 下拉刷新) 使用详解

    最近项目用到下拉刷新,上来加载更多,这里对PullToRefresh这控件进行了解和使用. 以下内容转载自:http://blog.csdn.net/lmj623565791/article/deta ...

  10. 转:android listview局部刷新和模拟应用下载

    在 android开发中,listview是比较常用的一个组件,在listview的数据需要更新的时候,一般会用 notifyDataSetChanged()这个函数,但是它会更新listview中所 ...

随机推荐

  1. Modular Inverse(模逆元,扩展欧几里德)

    Modular Inverse Time Limit: 2 Seconds      Memory Limit: 65536 KB The modular modular multiplicative ...

  2. Android API 中文(76)——AdapterView.OnItemLongClickListener

    前言 本章内容是android.widget.AdapterView.OnItemLongClickListener,版本为Android 2.3 r1,翻译来自"cnmahj", ...

  3. 与一线Linux嵌入式开发project师的对话

    转:与一线Linux嵌入式开发project师的对话 陈project师一直做Linux的嵌入式开发.作为在开发一线的project师.他对非常多问题的看法可能更切合实际需求,于是,通过邮件.就嵌入式 ...

  4. [小知识点]IE6下不支持:hover的解决方法

    在网上百度到的解决办法,感觉不错,和大家分享一下. 在CSS样式里加一句代码"body{behavior:url("文件夹/csshover.htc");}"即 ...

  5. Ubuntu 15.04 设置thin1.6.4作为Rails4.2.5的默认服务器

    0. gem install thin //安装1.6.4 1. 进入到Raisl项目的根目录. 2. 在Gemfile中加入一行 gem 'thin' 3. 运行 bundle install 4. ...

  6. Linux 环境下 fork 函数和 exec 函数族的使用

    前言 接触 Linux 已经有几个月了,以前在网上看各路大神均表示 Windows 是最烂的开发平台,我总是不以为然,但是经过这段时间琢磨,确实觉得 Linux 开发给我带来不少的便利.下面总结一下学 ...

  7. php 自己写的好看的分页类

    自己写的一个分页类 ,不是很完整,个别没有做验证,但可以使用,分页效果见文章底部.除了链接数据库的代码没有粘贴上来,其他的都粘贴了.供学习使用- <?php /** * Created by P ...

  8. python中的异常如何处理

    一.异常基础 在编程程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面. try: #正常逻辑代码 input = raw_input("输入数字:") data ...

  9. Socket 基础解析使用ServerSocket建立聊天服务器

    很简单的教程哦! 1.socket 简介 Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ServerSocket 用于 ...

  10. 设计模式多线程方面之Thread-Per-Message 模式

    Thread-Per-Message模式是一个很简单但很常应用的模式,尤其是在GUI程式中,我们举个例子,当您设计一个文件编辑器时,您可能像这样注册一个开启档案的事件处理:  menuOpenFile ...