Android開發(fā)之ListView實現(xiàn)Item局部刷新
對于android中的ListView刷新機制,大多數(shù)的程序員都是很熟悉的,修改或者添加adapter中的數(shù)據(jù)源之后,然后調用notifyDataSetChanged()刷新ListView。在這種模式下,我們會在getView中,根據(jù)不同的數(shù)據(jù)源,讓控件顯示不同的內容。這種模式是最常見的刷新模式,當我們來回滑動ListView的時候,調用adapter的getView方法,然后listview對adapter返回的View進行繪制。這種模式下,View的顯示內容或狀態(tài)都記錄在adapter里面的數(shù)據(jù)源中,listview的更新頻率不頻繁,它隨著數(shù)據(jù)源的變化而更新。
但是腳本之家小編在做公司項目的時候,有個下載模塊,因為可能同時下載好幾個數(shù)據(jù),所以用的listview展示所有正在下載的內容。因為下載進度要實時更新,所以要不停的調用notifyDateSetChanged刷新數(shù)據(jù)。這樣會不停的重新繪制整個listview的界面,性能開銷非常大。而且如果每個item有圖片的話,每個item的圖片都需要重新加載,就算圖片做了內存緩存,刷新一下圖片也會閃一下,不停的刷新就會導致各個item的圖片不停的閃,體驗一點都不好。
那么對于上面問題,有沒有解決辦法呢?當然是有的。我們可以針對某一個item進行局部更新,而不影響其它沒有修改的item。那么具體如何實現(xiàn)的呢?我們看下面的代碼。
private void updateView(int itemIndex) { //得到第一個可顯示控件的位置, int visiblePosition = mListView.getFirstVisiblePosition(); //只有當要更新的view在可見的位置時才更新,不可見時,跳過不更新 if (itemIndex - visiblePosition >= ) { //得到要更新的item的view View view = mListView.getChildAt(itemIndex - visiblePosition); //調用adapter更新界面 mAdapter.updateView(view, itemIndex); } }
這個函數(shù)主要是根據(jù)傳入的itemIndex來獲取第itemIndex的數(shù)據(jù)所顯示的view。itemIndex就是要修改的數(shù)據(jù)再List集合中的位置,比如我這里下載進度有更新,發(fā)了一個廣播這里接收到了,需要修改該下載內容的進度條,廣播接收器可以這么寫:
@Override public void onReceive(Context context, Intent intent) { AppContent appContent = intent.getParcelableExtra("appContent"); if(appContent == null) return; int itemIndex = ; for(AppContent appContent : mList) { if(appContent.getUrl().equals(appContent.getUrl())) { itemIndex = mList.indexOf(appContent); appContent.setDownloadPercent(appContent.getDownloadPercent()); break; } } updateView(itemIndex); }
下面看Adapter的具體代碼:
public class AppContentAdapter extends BaseAdapter{ private List<AppContent> mDates = null; private Context mContext; public AppContentAdapter(Context context) { this.mContext = context; } @Override public int getCount() { return mDates.size(); } @Override public Object getItem(int position) { return mDates.get(position); } @Override public long getItemId(int position) { return position; } public void setDates(List<AppContent> mDates) { this.mDates = mDates; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { holder = new ViewHolder(); convertView = LayoutInflater.from(mContext).inflate( R.layout.listitem_download, null); holder.statusIcon = (DownloadPercentView) convertView.findViewById(R.id.status_icon); holder.name = (TextView) convertView.findViewById(R.id.name); holder.downloadPercent = (TextView) convertView.findViewById(R.id.download_percent); holder.progressBar = (ProgressBar) convertView.findViewById(R.id.progressbar); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } setData(holder, position); return convertView; } /** * 設置viewHolder的數(shù)據(jù) * @param holder * @param itemIndex */ private void setData(ViewHolder holder, int itemIndex) { AppContent appContent = mDates.get(itemIndex); holder.name.setText(appContent.getName()); holder.progressBar.setProgress(appContent.getDownloadPercent()); setIconByStatus(holder.statusIcon, appContent.getStatus()); if(appContent.getStatus() == AppContent.Status.PENDING) { holder.downloadPercent.setVisibility(View.INVISIBLE); } else { holder.downloadPercent.setVisibility(View.VISIBLE); holder.statusIcon.setProgress(appContent.getDownloadPercent()); holder.downloadPercent.setText("下載進度:" + appContent.getDownloadPercent() + "%"); } } /** * 局部刷新 * @param view * @param itemIndex */ public void updateView(View view, int itemIndex) { if(view == null) { return; } //從view中取得holder ViewHolder holder = (ViewHolder) view.getTag(); holder.statusIcon = (DownloadPercentView) view.findViewById(R.id.status_icon); holder.name = (TextView) view.findViewById(R.id.name); holder.downloadPercent = (TextView) view.findViewById(R.id.download_percent); holder.progressBar = (ProgressBar) view.findViewById(R.id.progressbar); setData(holder, itemIndex); } /** * 根據(jù)狀態(tài)設置圖標 * @param downloadPercentView * @param status */ private void setIconByStatus(DownloadPercentView downloadPercentView, AppContent.Status status) { downloadPercentView.setVisibility(View.VISIBLE); if(status == AppContent.Status.PENDING) { downloadPercentView.setStatus(DownloadPercentView.STATUS_PEDDING); } if(status == AppContent.Status.DOWNLOADING) { downloadPercentView.setStatus(DownloadPercentView.STATUS_DOWNLOADING); } if(status == AppContent.Status.WAITING) { downloadPercentView.setStatus(DownloadPercentView.STATUS_WAITING); } if(status == AppContent.Status.PAUSED) { downloadPercentView.setStatus(DownloadPercentView.STATUS_PAUSED); } if(status == AppContent.Status.FINISHED) { downloadPercentView.setStatus(DownloadPercentView.STATUS_FINISHED); } } private class ViewHolder { private DownloadPercentView statusIcon; private TextView name; private TextView downloadPercent; private ProgressBar progressBar; } }
其實這些代碼就是我上篇博文《AsyncTask實現(xiàn)多任務多線程下載》的例子中的,如果需要可以去下載。
以上內容是關于Android開發(fā)之ListView實現(xiàn)Item局部刷新的全部內容,希望對大家有用,更多有關listview局部刷新問題,請登錄腳本之家官網查詢,謝謝!
- android的ListView點擊item使item展開的做法的實現(xiàn)代碼
- Android編程實現(xiàn)Listview點擊展開和隱藏的方法
- Android編程實現(xiàn)ListView中item部分區(qū)域添加點擊事件功能
- Android開發(fā)實現(xiàn)ListView點擊item改變顏色功能示例
- Android 實現(xiàn)ListView的點擊變色的實例
- Android ListView的Item點擊效果的定制
- Android實現(xiàn)為ListView同時設置點擊時的背景和點擊松手之后的背景
- Android ListView的item背景色設置和item點擊無響應的解決方法
- android ListView內數(shù)據(jù)的動態(tài)添加與刪除實例代碼
- android ListView和GridView拖拽移位實現(xiàn)代碼
- Android開發(fā)實現(xiàn)ListView點擊展開收起效果示例
相關文章
分別用ToolBar和自定義導航欄實現(xiàn)沉浸式狀態(tài)欄
本文主要介紹了分別用ToolBar和自定義導航欄實現(xiàn)沉浸式狀態(tài)欄的方法步驟,具有一定的參考價值,下面跟著小編一起來看下吧2017-01-01Android自定義控件實現(xiàn)帶文字提示的SeekBar
這篇文章主要給大家介紹了關于Android自定義控件實現(xiàn)帶文字提示的SeekBar的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12Android實現(xiàn)快速滾動FastScrollView效果
這篇文章主要介紹了Android實現(xiàn)快速滾動FastScrollView效果,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08為Retrofit統(tǒng)一添加post請求的默認參數(shù)的方法
這篇文章主要介紹了為Retrofit統(tǒng)一添加post請求的默認參數(shù)的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04Android 實現(xiàn)圖片轉二進制流及二進制轉字符串
這篇文章主要介紹了Android 實現(xiàn)圖片轉二進制流及二進制轉字符串,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03