当前位置: 首页 > 科技观察

AndroidKitKat:ListView实现Item的部分刷新

时间:2023-03-16 00:21:55 科技观察

大家都知道,要刷新ListView的数据,只要改变Adapter的数据源,然后调用Adapter的notifyDateSetChanged()方法即可。但是博主在做公司项目的时候,有一个下载模块,因为可能会同时下载几条数据,所以用listview来展示所有下载的内容。因为需要实时更新下载进度,所以需要不断调用notifyDateSetChanged刷新数据。这样整个listview界面会不断重绘,性能开销非常大。而如果每个item都有图片,则需要重新加载每个item的图片。即使图片缓存在内存中,刷新时图片也会闪一次。连续刷新会导致每一项的图片不断闪烁。一点都不好。那么对于上面的问题,有解决办法吗?当然有。我们可以在不影响其他未修改的项目的情况下对项目执行部分更新。那么如何实现呢?让我们看看下面的代码。1privatevoidupdateView(intitemIndex){2//获取第一个可显示控件的位置,3intvisiblePosition=mListView.getFirstVisiblePosition();4//只在待更新的view处于可见位置时更新,不可见时跳过不更新5if(itemIndex-visiblePosition>=0){6//获取待更新item的view7Viewview=mListView.getChildAt(itemIndex-visiblePosition);8//调用adapter更新接口9mAdapter.updateView(view,itemIndex);10}11}该函数主要是根据传入的itemIndex获取itemIndex数据显示的view。itemIndex是要修改的数据在List集合中的位置。比如我这里更新了下载进度。我发了一个广播,这里收到了。我需要修改下载内容的进度条。广播接收器可以这样写:1@Override2publicvoidonReceive(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{23privateListmDates2Override21publiclonggetItemId(intposition){22returnposition;23}2425publicvoidsetDates(ListmDates){26this.mDates=mDates;27}2829@Override30publicViewgetView(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}4748/**49*设置viewHolder的数据50*@paramholder51*@paramitemIndex52*/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}666768/**69*局刷新70*@paramview71*@paramitemIndex72*/73publicvoidupdateView(Viewview,intitemIndex){74if(view==null){75return;76}77//从view中取得holder78ViewHolderholder=(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}8586/**87*根据状态设置图标88*@paramdownloadPercentView89*@paramstatus90*/91privatevoidsetIconByStatus(DownloadPercentViewdownloadPercentView,AppContent.Statusstatus){92downloadPercentView.setVisibility(View.VISIBLE);93if(status==AppContent.Status.PENDING){94downloadPercentView.setStatus(DownloadPercentView.STATUS_PEDDING);95}96if(status==AppContent.Status。下载){97downloadPercentView.setStatus(DownloadPercentView.STATUS_DOWNLOADING);98}if(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}109110privateclassViewHolder{111privateDownloadPercentViewstatusIcon;112privateTextViewname;113privateTextViewdownloadPercent;114privateProgressBarprogressBar;115}116}详细示例参考:https://github.com/liuling07/MultiTaskAndThreadDownload

最新推荐
猜你喜欢