Android ListView隻加載當前屏幕內的圖片(解決list滑動時加載卡頓)
最近在做ListView分頁顯示,其中包括圖片 和文字(先下載解析文字內容,再異步加載圖片)發現每次點擊下一頁後,文字內容加載完畢,馬上向下滑動,由於這時後台在用線程池異步下載圖片,我每頁有20條,也就是20張圖片,會導致listview滑動卡頓!
這是用戶不想看到的,我參考了網易新聞和電子市場等應用,發現它們都是隻加載屏幕內的圖片,不現實的不加載,於是我也仿照做了一個。我是菜鳥,我承認 嗬嗬,雖然不見得完全和他們的一樣,但是確實解決了翻頁時那一刻的卡頓現象。
因為未發現網上有相關文章,希望對朋友們有用~
下麵是相關代碼(分頁的就沒放):
/** * list滾動監聽 */ listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub // 異步加載圖片 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {//list停止滾動時加載圖片 pageImgLoad(_start_index, _end_index); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub //設置當前屏幕顯示的起始index和結束index _start_index = firstVisibleItem; _end_index = firstVisibleItem + visibleItemCount; if (_end_index >= totalItemCount) { _end_index = totalItemCount - 1; } } });
/** * 隻加載from start_index to end_index 的圖片 * @param start_index * @param end_index */ private void pageImgLoad(int start_index, int end_index) { for (; start_index < end_index; start_index++) { HashMap<String, Object> curr_item = adapter.getItem(start_index); if (curr_item.get(Constant.NEWS_ICON_URL) != null && curr_item.get(Constant.NEWS_ICON) == null) { loadImage(curr_item); } } }
異步加載圖片代碼,這裏我之前使用的是AsyncTask,但是繼承AsyncTask後不能被執行多次,所以我改用了線程唿叫handler更新UI:
/** * 異步加載圖片 * @param curr_item */ private void loadImage(final HashMap<String, Object> curr_item) { executorService.submit(new Runnable() { public void run() { try { Drawable curr_icon = null; String icon_URL = (String) curr_item .get(Constant.NEWS_ICON_URL); String newsId = (String) curr_item.get(Constant.NEWS_ID); if (imageCache.containsKey(icon_URL)) {//軟引用 SoftReference<Drawable> softReference = imageCache .get(icon_URL); curr_icon = softReference.get(); System.out.println("CASE USING SoftReference!!!!!!!!!!!!!!!!!!!!"); } if (curr_icon == null) { HttpUtils hu = new HttpUtils(); FileUtils fu = new FileUtils(); if (hu.is_Intent(Home_Activity.this)) { fu.write2LocalFromIS(Home_Activity.this, newsId + Constant.SAVE_NEWS_ICON_NAME + Constant.SAVE_IMG_SUFFIX, hu.getISFromURL(icon_URL)); } // 從本地加載圖片 如果沒網則直接加載本地圖片 curr_icon = fu.readDrawableFromLocal( Home_Activity.this, newsId + Constant.SAVE_NEWS_ICON_NAME + Constant.SAVE_IMG_SUFFIX); imageCache.put(icon_URL, new SoftReference<Drawable>( curr_icon)); } curr_item.put(Constant.NEWS_ICON, curr_icon); // UI交給handler更新 Message msg = _viewHandler.obtainMessage(); msg.arg1 = Constant.MSG_LIST_IMG_OK; msg.sendToTarget(); } catch (Exception e) { throw new RuntimeException(e); } } }); }
@Override public void handleMessage(Message msg) { switch (msg.arg1) { case Constant.MSG_LIST_IMG_OK: // 更新UI adapter.notifyDataSetChanged(); break; } super.handleMessage(msg); } };
上個圖吧:
最後更新:2017-04-02 22:14:28