首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android奇巧:ListView实现Item局部刷新

【大咖・来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》 对于ListView数据的刷新大家都知道,改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可。 但是博主在做公司项目的时候,有个下载模块,因为可能同时下载好几个数据,所以用的listview展示所有正在下载的内容。因为下载进度要实时更新,所以要不停的调用notifyDateSetChanged刷新数据。这样会不停的重新绘制整个listview的界面,性能开销非常大。而且如果每个item有图片的话,每个item的图片都需要重新加载,就算图片做了内存缓存,刷新一下图片也会闪一下,不停的刷新就会导致各个item的图片不停的闪,体验一点都不好。 那么对于上面问题,有没有解决办法呢?当然是有的。我们可以针对某一个item进行局部更新,而不影响其它没有修改的item。那么具体如何实现的呢?我们看下面的代码。 1privatevoidupdateView(intitemIndex){ 2//得到***个可显示控件的位置, 3intvisiblePosition=mListView.getFirstVisiblePosition(); 4//只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新 5if(itemIndex-visiblePosition>=0){ 6//得到要更新的item的view 7Viewview=mListView.getChildAt(itemIndex-visiblePosition); 8//调用adapter更新界面 9mAdapter.updateView(view,itemIndex); 10} 11} 这个函数主要是根据传入的itemIndex来获取第itemIndex的数据所显示的view。itemIndex就是要修改的数据再List集合中的位置,比如我这里下载进度有更新,发了一个广播这里接收到了,需要修改该下载内容的进度条,广播接收器可以这么写: 1@Override 2publicvoidonReceive(Contextcontext,Intentintent){ 3AppContentappContent=intent.getParcelableExtra("appContent"); 4if(appContent==null)return; 5intitemIndex=0; 6for(AppContentappContent1:mList){ 7if(appContent.getUrl().equals(appContent1.getUrl())){ 8itemIndex=mList.indexOf(appContent1); 9appContent1.setDownloadPercent(appContent.getDownloadPercent()); 10break; 11} 12} 13updateView(itemIndex); 14} 下面看Adapter的具体代码: 1publicclassAppContentAdapterextendsBaseAdapter{ 2 3privateList<AppContent>mDates=null; 4privateContextmContext; 5 6publicAppContentAdapter(Contextcontext){ 7this.mContext=context; 8} 9 10@Override 11publicintgetCount(){ 12returnmDates.size(); 13} 14 15@Override 16publicObjectgetItem(intposition){ 17returnmDates.get(position); 18} 19 20@Override 21publiclonggetItemId(intposition){ 22returnposition; 23} 24 25publicvoidsetDates(List<AppContent>mDates){ 26this.mDates=mDates; 27} 28 29@Override 30publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ 31ViewHolderholder=null; 32if(convertView==null){ 33holder=newViewHolder(); 34convertView=LayoutInflater.from(mContext).inflate( 35R.layout.listitem_download,null); 36holder.statusIcon=(DownloadPercentView)convertView.findViewById(R.id.status_icon); 37holder.name=(TextView)convertView.findViewById(R.id.name); 38holder.downloadPercent=(TextView)convertView.findViewById(R.id.download_percent); 39holder.progressBar=(ProgressBar)convertView.findViewById(R.id.progressbar); 40convertView.setTag(holder); 41}else{ 42holder=(ViewHolder)convertView.getTag(); 43} 44setData(holder,position); 45returnconvertView; 46} 47 48/** 49*设置viewHolder的数据 50*@paramholder 51*@paramitemIndex 52*/ 53privatevoidsetData(ViewHolderholder,intitemIndex){ 54AppContentappContent=mDates.get(itemIndex); 55holder.name.setText(appContent.getName()); 56holder.progressBar.setProgress(appContent.getDownloadPercent()); 57setIconByStatus(holder.statusIcon,appContent.getStatus()); 58if(appContent.getStatus()==AppContent.Status.PENDING){ 59holder.downloadPercent.setVisibility(View.INVISIBLE); 60}else{ 61holder.downloadPercent.setVisibility(View.VISIBLE); 62holder.statusIcon.setProgress(appContent.getDownloadPercent()); 63holder.downloadPercent.setText("下载进度:"+appContent.getDownloadPercent()+"%"); 64} 65} 66 67 68/** 69*局部刷新 70*@paramview 71*@paramitemIndex 72*/ 73publicvoidupdateView(Viewview,intitemIndex){ 74if(view==null){ 75return; 76} 77//从view中取得holder 78ViewHolderholder=(ViewHolder)view.getTag(); 79holder.statusIcon=(DownloadPercentView)view.findViewById(R.id.status_icon); 80holder.name=(TextView)view.findViewById(R.id.name); 81holder.downloadPercent=(TextView)view.findViewById(R.id.download_percent); 82holder.progressBar=(ProgressBar)view.findViewById(R.id.progressbar); 83setData(holder,itemIndex); 84} 85 86/** 87*根据状态设置图标 88*@paramdownloadPercentView 89*@paramstatus 90*/ 91privatevoidsetIconByStatus(DownloadPercentViewdownloadPercentView,AppContent.Statusstatus){ 92downloadPercentView.setVisibility(View.VISIBLE); 93if(status==AppContent.Status.PENDING){ 94downloadPercentView.setStatus(DownloadPercentView.STATUS_PEDDING); 95} 96if(status==AppContent.Status.DOWNLOADING){ 97downloadPercentView.setStatus(DownloadPercentView.STATUS_DOWNLOADING); 98} 99if(status==AppContent.Status.WAITING){ 100downloadPercentView.setStatus(DownloadPercentView.STATUS_WAITING); 101} 102if(status==AppContent.Status.PAUSED){ 103downloadPercentView.setStatus(DownloadPercentView.STATUS_PAUSED); 104} 105if(status==AppContent.Status.FINISHED){ 106downloadPercentView.setStatus(DownloadPercentView.STATUS_FINISHED); 107} 108} 109 110privateclassViewHolder{ 111privateDownloadPercentViewstatusIcon; 112privateTextViewname; 113privateTextViewdownloadPercent; 114privateProgressBarprogressBar; 115} 116} 详细示例参考:https://github.com/liuling07/MultiTaskAndThreadDownload

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册