1. public void updateView(int itemIndex) {
  2. //得到第一个可显示控件的位置,
  3. int visiblePosition = mListView.getFirstVisiblePosition();
  4. //只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新
  5. if (itemIndex - visiblePosition >= 0) {
  6. //得到要更新的item的view
  7. View view = mListView.getChildAt(itemIndex - visiblePosition);
  8. //从view中取得holder
  9. ViewHolder holder = (ViewHolder) view.getTag();
  10. HashMap<String, Object> item = data.get(itemIndex);
  11. holder.listItem = (RelativeLayout) view.findViewById(R.id.rl_item);
  12. holder.ibPlay = (ImageButton) view.findViewById(R.id.ib_play);
  13. holder.ibDelete = (ImageButton) view.findViewById(R.id.ib_delete);
  14. holder.tvName = (TextView) view.findViewById(R.id.tv_record_sound_name);
  15. holder.tvLastModifyTime = (TextView) view
  16. .findViewById(R.id.tv_record_time);
  17. holder.tvCurrentPlayTime = (TextView) view
  18. .findViewById(R.id.tv_current_play_time);
  19. holder.tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time);
  20. holder.sb = (MySeekBar) view.findViewById(R.id.pb_play);
  21. holder.layout = (LinearLayout) view
  22. .findViewById(R.id.play_progress_info);
  23. updateData(itemIndex, holder, item);
  24. }
  25. }

自定义一个adapter继承BaseAdapter,写一个如上的方法,要更新数据时,不要调用notifyDataSetChanged()方法,调用上面的方法,即可做到更新单个item

在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。

注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!

即取值范围在 >= ListView.getFirstVisiblePosition() &&  <= ListView.getLastVisiblePosition(); 
1)所以如果想获取前部的将会出现返回Null值空指针问题; 
2)getChildCount跟getCount获取的值将会不一样(数量多时); 
3 )如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。 
   需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView。getFirstVisiblePosition()).findViewById(...)去设置值 
2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据

//全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动  
伪代码 
ListView设置 
public int scrollStates; 
class OnScrollListenerImpl implements OnScrollListener{ 
@Override 
public void onScrollStateChanged(AbsListView view, int scrollState) { 
scrollStates = scrollState;  
}

@Override 
public void onScroll(AbsListView view, int firstVisibleItem, 
int visibleItemCount, int totalItemCount) { 
int lastInScreen = firstVisibleItem + visibleItemCount; 

listView.setOnScrollListener(new OnScrollListenerImpl());

Activity中 
if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){

更新视图数据 
}

下面这个方法是google 2011年开发者大会上提出的方法——ListView单条更新:

首先我们看一下adapter的getView方法,我们要进行单条刷新就要手动调用这个方法。

public View getView(int position, View convertView, ViewGroup parent)

那么这三个参数是如何确定的呢,第三个参数很好确定,就是你的listview。

为了确定另外两个参数position和converView,这里介绍几个lisView的新方法:

getFirstVisiblePosition(),该方法获取当前状态下list的第一个可见item的position。

getLastVisiblePosition(),该方法获取当前状态下list的最后一个可见item的position。

getItemAtPosition(int position),该方法返回当前状态下position位置上listView的convertView

ps:这里的convertView是复用的,也就是说不管position的值是多大(这个要看你整个list有多大),converView的个数应该始终是屏幕上能显示的list的条数那么多。

所 以,我们通过从getFirstVisiblePosition的值到getLastVisiblePosition的值之间的listitem和需要进 行更新的条件(比如id)进行比较确定哪一个是要更新的(如果不在当前可是范围内也就没有必要更新了,等list拉动的时候自然就会更新出来)

    private void updateSingleRow(ListView listView, long id) {  if (listView != null) {  int start = listView.getFirstVisiblePosition();  for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++)  if (id == ((Messages) listView.getItemAtPosition(i)).getId()) {  View view = listView.getChildAt(i - start);  getView(i, view, listView);  break;  }  }  }  

listview 刷新某一个item相关推荐

  1. 怎样获得listview的第一个item?

    ============问题描述============ 想对一个listview的第一行高亮显示. 用listview.getchildat(0)是可以,但是当数据较多时,下一页的第一行也被高亮了, ...

  2. listview嵌套listview,子listview只显示一个item问题

    背景: 我在做项目的时候准备用listview嵌套一个listview,但是发现,子listview只显示一条数据,于是,一猜又是计算高度出问题了. 处理办法,当然是和scrollview嵌套list ...

  3. Android 取得 ListView中每一个Item项目的值

    首先我们需要创建 ListView ,这里假定我们已经创建好了并且使用SimpleAdapter设置好了adapter数据,看一下我们的adapter ArrayList<HashMap< ...

  4. ListView如何单独刷新一个item

    扣扣技术交流群:460189483 对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可. 但是我在做公司 ...

  5. ScrollView 内嵌 ListView 只能看到第一个Item

    解决方案: 给ScrollView 设置 fillViewport 为 true,ListView 就不会只显示第一个了. <ScrollView xmlns:android="htt ...

  6. android listview中item倒计时,GitHub - TangAnna/ListViewTimer: 列表中每一个item都有计时器 (可实现倒计时或者计时器的功能)...

    ListViewTimer 列表中每一个item都有计时器 (可实现倒计时或者计时器的功能) 项目中有时会遇到列表中含有倒计时或者是计时器的需求,实现的方式有很多种,此Demo中是使用Thread + ...

  7. listview当选中某一个item时设置背景色其他的不变

    2019独角兽企业重金招聘Python工程师标准>>> listview当选中某一个item时设置背景色其他的不变: 可以使用listview.setOnFoucsChangeLis ...

  8. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    转载请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877),请尊重他人的辛勤劳动成果,谢谢! 今天还是 ...

  9. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199) 我在上一篇文章中Android 带你从源码的角度解析 ...

  10. android ListView 刷新卡顿问题

    本人刚接触android开发,最近遇到一个关于ListView 刷新item一直卡顿的现象,进度条一直只刷新两次就结束了,灰常不明白,各种百度,各种找资料,什么线程什么的都试了遍,然并卵.一直到看到了 ...

最新文章

  1. 多个tab可以组成一个表单吗 js_11个表单设计小技巧
  2. id设置为10000开始
  3. 谷歌54量子计算机,量子计算机要来了:谷歌开发了一种名为“ Sycamore”的新型54比特处理器,其200秒产生的输出将需要世界上最快的超级计算机10,000年 - googleblog...
  4. Html.BeginForm() vs Ajax.BeginForm() in MVC3
  5. mysql 取数据 展示_php mysql_fetch_row逐行获取结果集数据并显示在table表格中
  6. android第三方推送实现,Android--利用第三方推送实现APP伪保活(小米篇)
  7. C#笔记09 结构、枚举、异常、泛型、操作符重载、dll、垃圾回收与资源清理、XML注释
  8. 深大自考本科所需课程
  9. iOS 设计模式浅析 0 - 前言
  10. ymPrompt.js消息提示组件 详解 .
  11. 8.docker search
  12. 什么是代理服务器?【2022版指南】
  13. 计算机win7卡顿如何解决方法,win7卡顿严重解决方法_win7运行卡顿严重最流畅设置方法-win7之家...
  14. 如何理解开仓与平仓规则?
  15. Windows10 无法使用内置管理员打开照片问题解决
  16. Java 实现十进制数转换为二进制
  17. 如何重装oracle数据库,oracle数据库的重装
  18. BGP进阶:BGP 综合实验一
  19. 了解常见的网络设备及其功能
  20. CDN引入elementUI语言设置为英语

热门文章

  1. 【Ubuntu录屏软件】SimpleScreenRecorder的安装与使用
  2. 一本教你如何编写高质量代码的图书:《设计模式之美》
  3. 高斯核函数 python实现
  4. JLink OB STM32F072 固件的过程
  5. 中国气象数据要注册或交钱才给,咱们就去美国下载免费数据
  6. JDY-31蓝牙模块测试
  7. 计算机二级MS office之excel常用函数
  8. 深入浅出计算机组成原理
  9. 基于JSP实现学校社团管理系统
  10. MQTT测试工具推荐