問題引入:
demo中需做個下載個下載管理界面。同時只能下載一個任務,但是下載隊列可以有多個下載任務。
當更新當前正在下載的任務的時候,使用 notifyDataSetChanged();方法會使整個頁面都會刷新。
而且進度更新比較頻繁,這就造成了內存的消耗和頁面卡頓(在進度更新很頻繁的情況),筆者甚至出現了卡住頁面無法進行操作的情況。
所以想到了能不能局部刷新某個Item。也查了下資料,問題解決。
解決思路:
通過listview.getFirstVisiblePosition()方法獲取到顯示的item的首個位置 ,再根據position, 計算出view的位置。獲取到具體的view後,對view進行操作,就能夠實現局部刷新了。
關鍵代碼:
- public void updateView(int itemIndex) {
- //得到第一個可顯示控件的位置,
- int visiblePosition = mListView.getFirstVisiblePosition();
- //只有當要更新的view在可見的位置時才更新,不可見時,跳過不更新
- if (itemIndex - visiblePosition >= 0) {
- //得到要更新的item的view
- View view = mListView.getChildAt(itemIndex - visiblePosition);
- //從view中取得holder
- ViewHolder holder = (ViewHolder) view.getTag();
-
- HashMap<String, Object> item = data.get(itemIndex);
- //獲取到具體的控件,
- holder.name = (TextView) view.findViewById(R.id.name);
- holder.process = (ProcessBar) view.findViewById(R.id.process);
- .......
- //對控件進行操作
- holder.process.setMax(item.get("max"));
- holder.process.setProgress(item.get("progress"));
- ......
- }
- }