众所周知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. AOP 面向切面编程、拦截器

    AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术.它是一种新的方法论, ...

  2. Sicily-1134

    一.      题意 按照孩子们需要的积木块数排序(从小到大),先处理需要积木块数少的孩子. 二.      代码 // // main.cpp // sicily-1134 // // Create ...

  3. hdoj 1874 畅通工程续(单源最短路+dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 思路分析:该问题给定一个无向图.起始点和终点,要求求出从起始点到终点的最短距离: 使用Dijks ...

  4. Flex 百度地图API使用

    今天想看一下Flex中关于地图方面的使用,刚开始看了google map api, 感觉用起来挺麻烦,关键是英文不好,文档读起来费劲,还有密钥神马的~ 那我就试验一下百度地图的接口,文档是中文的. 首 ...

  5. Python学习入门基础教程(learning Python)--2.2.1 Python下的变量解析

    前文提及过变量代表内存里的某个数据,这个说法有根据么? 这里我们介绍一个python内建(built-in)函数id.我们先看看id函数的帮助文档吧.在python查某个函数的帮助文档很简单,只用he ...

  6. 【转】Nginx+Tomcat搭建高性能负载均衡集群

    最近对负载均衡比较感兴趣,研究了公司的负载均衡的配置,用的是阿里的SLB,相当于不用运维,只需要在后台进行简单的配置就能完成Tomcat的负载均衡,索性在网上找了几篇文章去尝试搭建一个集群,然而很多都 ...

  7. 织梦dedeCMS|系统基本配置标签

    站点根网址:    {dede:global.cfg_basehost/}调出网站的名称:   {dede:field.title/}-{dede:global.cfg_webname/}    网站 ...

  8. [mysql]子查询与连接

    1,子查询(Subquery)是指出现在其他 SQL 语句内的select子句 例如: select * from t1 where col1 = (select col2 from t2); 其中 ...

  9. projecteuler之58题Spiral primes

    package com.android; public class SpiralPrimes { public static void main(String args[]) { long numPr ...

  10. dede修改移动文档的js

    dede后台弹框修改: 想做个类似文章列表的移动功能,弹框,然后修改成功到表 先在list.js里复制一份moveArc的方法,到archives_do.php里复制一份moveArchives的方法 ...