众所周知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. ie调试控制台

    function initConsole() { var console = document.createElement('div'); console.id = 'errorConsole'; d ...

  2. SSIS: 使用最大ID和最大日期来增量更新表

    简单三步: 1.  新增变量 MaxID和MaxCreateDate以及Variable 2.  放置一个 Execute SQL  Task ,用SQL 来获取 MaxID和MaxCreateDat ...

  3. 使用R进行相关性分析

    基于R进行相关性分析 一.相关性矩阵计算: [1] 加载数据: >data = read.csv("231-6057_2016-04-05-ZX_WD_2.csv",head ...

  4. STL之set和multiset(集合)

    set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. constructing sets #include #include using names ...

  5. HTTP status codes

    响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行.响应码分五种类型,由它们的第一位数字表示:1.1xx:信息,请求收到,继续处理2.2xx:成功,行为被成功地接受.理解和采纳3 ...

  6. 转: seajs手册与文档之 -- 快速参考 ( ~~useful )

    目录 快速参考 seajs.use seajs.config define require require.async exports module.exports 快速参考 该页面列举了 SeaJS ...

  7. QRadionButton 圆点样式

    QRadioButton::indicator {    width: 13px;    height: 13px;} QRadioButton::indicator::unchecked {     ...

  8. c++ ptrdiff_t 类型

    ptrdiff_t是C/C++标准库中定义的一个与机器相关的数据类型.ptrdiff_t类型变量通常用来保存两个指针减法操作的结果.ptrdiff_t定义在stddef.h(cstddef)这个文件内 ...

  9. utf8字节

    <pre name="code" class="html">[root@wx03 0724]# perl a1.pl 112 [root@wx03 ...

  10. VC++中的头文件包含问题

    在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系).也就是需要互相声明.好了,这时候会带来一些混乱.如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已 ...