日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android之ListView异步加载图片且仅显示可见子项中的图片

發布時間:2024/8/24 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android之ListView异步加载图片且仅显示可见子项中的图片 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

折騰了好多天,遇到 N 多讓人崩潰無語的問題,不過今天終于有些收獲了,這是實驗的第一版,有些混亂,下一步進行改造細分,先把代碼記錄在這兒吧。

網上查了很多資料,發現都千篇一律,抄來抄去,很多細節和完整實例都沒看到,只有自己一點點研究了,總體感覺 android 下面要顯示個圖片真不容易啊。


項目主要實現的功能:

異步加載圖片圖片內存緩存、異步磁盤文件緩存解決使用 viewHolder 后出現的圖片錯位問題優化列表滾動性能,僅顯示可見子項中的圖片無需固定圖片顯示高度,對高度進行緩存使列表滾動時不會因圖片高度變化而閃動,使滾動體驗 更加流暢圖片動畫展示效果,新加載的圖片顯示透明漸變動畫

沒有涉及到下拉加載和刷新數據,目前還沒接觸到這些,而且已發現自定義 ListView 中如果有添加 頂部和底部 的拉動加載更多數據提示的 view ,將會導致 ListView 的 child 數量和 position 混亂,所以只有先簡單使用 ListView 來做個效果。


核心主要是三個文件:MainActivity.java, ZAsyncImageLoader.java, DiaryListAdapter.java

下面貼代碼:


MainActivity.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 package com.ai9475.meitian; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.ActionBar; import android.support.v7.app.ActionBarActivity; import android.util.JsonReader; import android.util.Log; import android.view.Menu; import android.view.View; import android.widget.AbsListView; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toast; import com.ai9475.meitian.adapter.DiaryListAdapter; import com.ai9475.util.ZAsyncImageLoader; import com.ai9475.util.ZHttpRequest; import com.ai9475.util.ZLog; import com.ai9475.widget.PullToRefreshListView; import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.protocol.HTTP; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONStringer; import org.w3c.dom.Text; public class MainActivity extends ActionBarActivity { ????private static final String TAG = "MainActivity"; ????private ListView mDiaryListView; ????private DiaryListAdapter mDiaryListAdapter; ????private ZAsyncImageLoader mAsyncImageLoader; ????private Handler handler = new Handler(); ????private int endId = 0; ????private boolean isScrolling = false; ????@Override ????protected void onCreate(Bundle savedInstanceState) ????{ ????????Log.d("main activity", "start"); ????????// 執行父級初始化方法 ????????super.onCreate(savedInstanceState); ????????// 讓 ActionBar 浮動在 Activity 上方進行半透明遮蓋 ????????//this.supportRequestWindowFeature(Window.FEATURE_ACTION_BAR_OVERLAY); ????????// 解析視圖數據 ????????this.setContentView(R.layout.activity_main); ????????AppManager.getInstance().addActivity(this); ????????this.mAsyncImageLoader = new ZAsyncImageLoader(); ????????this.mAsyncImageLoader.setIsUseDiskCache(true); ????????this.mAsyncImageLoader.setCacheDir(AppConfig.IMAGE_CACHE_PATH); ????????// 配置 ActionBar 相關 ????????final ActionBar bar = this.getSupportActionBar(); ????????// 標題 ????????bar.setTitle("Bar"); ????????// 返回按鈕 ????????//bar.setDisplayHomeAsUpEnabled(true); ????????// 應用徽標控制 ????????//bar.setDisplayUseLogoEnabled(false); ????????// 應用圖標控制 ????????//bar.setDisplayShowHomeEnabled(true); ????????// 標題欄控制 ????????//bar.setDisplayShowTitleEnabled(true); ????????// 設置 TABS 導航模式 ????????bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); ????????/* ????????bar.getHeight(); ????????final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); ????????ViewTreeObserver scvto = scrollView.getViewTreeObserver(); ????????if (scvto != null) { ????????????scvto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { ????????????????@Override ????????????????public boolean onPreDraw() { ????????????????????scrollView.setPadding( ????????????????????????????scrollView.getPaddingLeft(), ????????????????????????????bar.getHeight(), ????????????????????????????scrollView.getPaddingRight(), ????????????????????????????scrollView.getPaddingBottom() ????????????????????); ????????????????????return true; ????????????????} ????????????}); ????????}*/ ????????/*Fragment fragmentA = new FragmentTab(); ????????Fragment fragmentB = new FragmentTab(); ????????Fragment fragmentC = new FragmentTab(); ????????tabA.setTabListener(new MyTabsListener(fragmentA)); ????????tabB.setTabListener(new MyTabsListener(fragmentB)); ????????tabC.setTabListener(new MyTabsListener(fragmentC));*/ ????????bar.addTab(bar.newTab().setText("ATab").setTabListener(new MyTabsListener())); ????????bar.addTab(bar.newTab().setText("BTab").setTabListener(new MyTabsListener())); ????????bar.addTab(bar.newTab().setText("CTab").setTabListener(new MyTabsListener())); ????????/*//bar.setDisplayShowHomeEnabled(false); ????????//bar.setDisplayShowTitleEnabled(false); ????????// 頂部幀布局操作欄 ????????final FrameLayout topActBar = (FrameLayout) findViewById(R.id.topActionBar); ????????// 底部幀布局操作欄 ????????final FrameLayout bottomActBar = (FrameLayout) findViewById(R.id.bottomActionBar); ????????// 列表滾動視圖 ????????final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView); ????????// 頂部操作欄綁定事件:同步設置滾動視圖頂部內邊距 ????????topActBar ????????????????.getViewTreeObserver() ????????????????.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { ????????????????????@Override ????????????????????public boolean onPreDraw() { ????????????????????????scrollView.setPadding( ????????????????????????????????scrollView.getPaddingLeft(), ????????????????????????????????topActBar.getHeight(), ????????????????????????????????scrollView.getPaddingRight(), ????????????????????????????????scrollView.getPaddingBottom() ????????????????????????); ????????????????????????return true; ????????????????????} ????????????????}); ????????// 底部操作欄綁定事件:同步設置滾動視圖底部內邊距 ????????bottomActBar ????????????????.getViewTreeObserver() ????????????????.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { ????????????????????@Override ????????????????????public boolean onPreDraw() { ????????????????????????scrollView.setPadding( ????????????????????????????????scrollView.getPaddingLeft(), ????????????????????????????????scrollView.getPaddingTop(), ????????????????????????????????scrollView.getPaddingRight(), ????????????????????????????????bottomActBar.getHeight() ????????????????????????); ????????????????????????return true; ????????????????????} ????????????????}); ????????*/ ????????//AppContext context = (AppContext) getApplicationContext(); ????????//context.test(); /* ????????ZAsyncImageLoader loader = new ZAsyncImageLoader(); ????????String url1 = "http://img.ai9475.com/data/attachment/images/meitian/c5/e4/59/c5e459f00dce21480c9941eefbb88f90_200.jpg"; ????????String url2 = "http://img.ai9475.com/data/attachment/images/meitian/f9/29/ee/f929ee1dd6af7b805744b9fb3f4f99b5_200.jpg"; ????????loader.loadDrawable(url1, new ZAsyncImageLoader.OnImageLoadListener() { ????????????@Override ????????????public void onLoaded(Drawable imageDrawable, String imageUrl) { ????????????????ImageView img = (ImageView) findViewById(R.id.showPic1); ????????????????img.setImageDrawable(imageDrawable); ????????????} ????????}); ????????loader.loadDrawable(url2, new ZAsyncImageLoader.OnImageLoadListener() { ????????????@Override ????????????public void onLoaded(Drawable imageDrawable, String imageUrl) { ????????????????ImageView img = (ImageView) findViewById(R.id.showPic2); ????????????????img.setImageDrawable(imageDrawable); ????????????} ????????});*/ ????????// 找到日記列表視圖對象 ????????this.mDiaryListView = (ListView) findViewById(R.id.diaryListCt); ????????new Thread(){ ????????????@Override ????????????public void run() { ????????????????Runnable runnable = new Runnable() { ????????????????????@Override ????????????????????public void run() { ????????????????????????loadDiaryListData(); ????????????????????} ????????????????}; ????????????????handler.post(runnable); ????????????} ????????}.start(); ????} ????/** ?????* 日記列表初始化 ?????*/ ????protected void initDiaryList(JSONArray diaryList) ????{ ????????Log.d("initDiaryList", "start"); ????????// 列表單元與數據的適配器生成 ????????this.mDiaryListAdapter = new DiaryListAdapter(this, this.mDiaryListView, this.mAsyncImageLoader, diaryList); ????????// 綁定列表數據單元適配器 ????????Log.d("initDiaryList", "setAdapter"); ????????this.mDiaryListView.setAdapter(this.mDiaryListAdapter); ????????Log.d("bindListViewEvents", "start"); ????????// 綁定日記列表事件 ????????this.bindListViewEvents(); ????????Log.d("DiaryListAdapter", "end"); ????} ????static int j = 0; ????/** ?????* 綁定日記列表事件 ?????*/ ????public void bindListViewEvents() ????{ ????????// 列表滾動事件 ????????this.mDiaryListView.setOnScrollListener(new AbsListView.OnScrollListener(){ ????????????@Override ????????????public void onScrollStateChanged(AbsListView absListView, int scrollState) ????????????{ ????????????????switch (scrollState) { ????????????????????case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: ????????????????????????ZLog.i(TAG, "OnScrollListener : SCROLL_STATE_TOUCH_SCROLL"); ????????????????????????mDiaryListAdapter.setIsSCrolling(true); ????????????????????????break; ????????????????????case AbsListView.OnScrollListener.SCROLL_STATE_FLING: ????????????????????????ZLog.i(TAG, "OnScrollListener : SCROLL_STATE_FLING"); ????????????????????????mDiaryListAdapter.setIsSCrolling(true); ????????????????????????break; ????????????????????case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: ????????????????????????// 第一個可見 item 的 position ????????????????????????int first = mDiaryListView.getFirstVisiblePosition(); ????????????????????????// 最后一個可見 item 的 position ????????????????????????int last = mDiaryListView.getLastVisiblePosition(); ????????????????????????// 屏幕上可見 item 的總數 ????????????????????????int onScreenCount = mDiaryListView.getChildCount(); ????????????????????????int total = first + last; ????????????????????????ZLog.i(TAG, "OnScrollListener : SCROLL_STATE_IDLE => " + (j++) +", first: "+ first +", last: "+ last +", total: "+ total +", onScreenCount:"+ onScreenCount); ????????????????????????mDiaryListAdapter.setIsSCrolling(false); ????????????????????????mDiaryListAdapter.setPositionRange(first, last); ????????????????????????View child; ????????????????????????int position; ????????????????????????for (int i = 0; i < onScreenCount; i++) { ????????????????????????????position = first + i; ????????????????????????????if (mDiaryListAdapter.isInPrevPositionRange(position)) { ????????????????????????????????ZLog.i(TAG, "inPrevPositionRange position:"+ position); ????????????????????????????????continue; ????????????????????????????} ????????????????????????????// 獲取可見 item 子項的視圖容器對象 ????????????????????????????child = mDiaryListView.getChildAt(i); ????????????????????????????ImageView picPhoto = (ImageView) child.findViewById(R.id.picPhoto); ????????????????????????????ImageView avatar = (ImageView) child.findViewById(R.id.avatar); ????????????????????????????try { ????????????????????????????????ZLog.i(TAG, "load image i:"+ first); ????????????????????????????????mDiaryListAdapter.loadImage(picPhoto, avatar, mDiaryListAdapter.getItem(position)); ????????????????????????????} catch (JSONException e) { ????????????????????????????????AppException.io(e); ????????????????????????????} ????????????????????????} ????????????????????????break; ????????????????????default: ????????????????????????break; ????????????????} ????????????} ????????????@Override ????????????public void onScroll(AbsListView absListView, int first, int last, int total) { ????????????????//mDiaryListAdapter.setPositionLimit(first, last); ????????????????//ZLog.i(TAG, "OnScrollListener : onScroll => " + (j++) +", first: "+ first +", last: "+ last +", total:"+ total); ????????????} ????????}); ????????// 列表單元點擊事件 ????????ZLog.i(TAG, "diaryListInit : setOnItemClickListener"); ????????this.mDiaryListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { ????????????@Override ????????????public void onItemClick(AdapterView<!--?--> adapterView, View view, int i, long l) { ????????????????getSupportActionBar().setTitle("點擊了: "+ i); ????????????} ????????}); ????????ZLog.i("DiaryListAdapter", "setOnRefreshListener"); ????????// 當向下拉動刷新時觸發列表更新事件 ????????/*this.mDiaryListView.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() { ????????????@Override ????????????public void onRefresh() { ????????????????getSupportActionBar().setTitle("執行加載…"); ????????????????loadDiaryListData(); ????????????????mDiaryListView.onRefreshComplete(); ????????????} ????????});*/ ????} ????public void loadDiaryListData() ????{ ????????ZLog.i(TAG, "loadDiaryListData : start"); ????????try { ????????????ZHttpRequest httpRequset = new ZHttpRequest(new ZHttpRequest.OnHttpRequestListener() { ????????????????@Override ????????????????public void onRequest(ZHttpRequest request) { ????????????????????ZLog.i(TAG, "request data : start"); ????????????????} ????????????????@Override ????????????????public void onSucceed(int statusCode, ZHttpRequest request) { ????????????????????// 創建每行數據的集合 ????????????????????ZLog.i(TAG, "request onSucceed : start"); ????????????????????try { ????????????????????????String content = request.getInputStream(); ????????????????????????if (content == null) { ????????????????????????????Toast.makeText(getApplicationContext(), "數據請求失敗", Toast.LENGTH_SHORT).show(); ????????????????????????????return; ????????????????????????} ????????????????????????JSONArray diaryList = new JSONArray(content); ????????????????????????/*if (asyncImageLoader.getMaxPosition() < 1) { ????????????????????????????asyncImageLoader.setPositionLimit(0, diaryList.length()); ????????????????????????}*/ ????????????????????????endId = ((JSONObject) diaryList.opt(diaryList.length() - 1)).getInt("id"); ????????????????????????initDiaryList(diaryList); ????????????????????} catch (IOException e) { ????????????????????????Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); ????????????????????} catch (JSONException e) { ????????????????????????Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); ????????????????????} ????????????????} ????????????????@Override ????????????????public void onFailed(int statusCode, ZHttpRequest request) { ????????????????????ZLog.i(TAG, "request onFailed : code"+ statusCode); ????????????????} ????????????}); ????????????httpRequset.get("http://m.ai9475.com/?con=meitian_app&endId=" + this.endId); ????????} catch (Exception e) { ????????????e.printStackTrace(); ????????????Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); ????????} ????} ????protected class MyTabsListener implements ActionBar.TabListener ????{ //??????? private Fragment fragment; //??????? public MyTabsListener(Fragment fragment) //??????? { //??????????? this.fragment = fragment; //??????? } ????????@Override ????????public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) ????????{ //??????????? ft.add(R.id.fragmentPlace, this.fragment, null); ????????} ????????@Override ????????public void onTabReselected(ActionBar.Tab arg0, FragmentTransaction arg1) { ????????????// TODO Auto-generated method stub ????????} ????????@Override ????????public void onTabUnselected(ActionBar.Tab arg0, FragmentTransaction arg1) { ????????????// TODO Auto-generated method stub ????????} ????} ????/** ?????* 配置 ActionBar ?????* ?????* @param menu ?????* @return ?????*/ ????public boolean onCreateOptionsMenu(Menu menu) ????{ ????????this.getMenuInflater().inflate(R.menu.main, menu); ????????return super.onCreateOptionsMenu(menu); ????} ????/*public void doClick(View view) ????{ ????????ZHttpRequest get = new ZHttpRequest(); ????????get ????????????????.setCharset(HTTP.UTF_8) ????????????????.setConnectionTimeout(5000) ????????????????.setSoTimeout(5000); ????????get.setOnHttpRequestListener(new ZHttpRequest.OnHttpRequestListener() { ????????????@Override ????????????public void onRequest(ZHttpRequest request) throws Exception { ????????????} ????????????@Override ????????????public String onSucceed(int statusCode, ZHttpRequest request) throws Exception { ????????????????return request.getInputStream(); ????????????} ????????????@Override ????????????public String onFailed(int statusCode, ZHttpRequest request) throws Exception { ????????????????return "GET 請求失敗:statusCode "+ statusCode; ????????????} ????????}); ????????ZHttpRequest post = new ZHttpRequest(); ????????post ????????????????.setCharset(HTTP.UTF_8) ????????????????.setConnectionTimeout(5000) ????????????????.setSoTimeout(10000); ????????post.setOnHttpRequestListener(new ZHttpRequest.OnHttpRequestListener() { ????????????private String CHARSET = HTTP.UTF_8; ????????????private ContentType TEXT_PLAIN = ContentType.create("text/plain", Charset.forName(CHARSET)); ????????????@Override ????????????public void onRequest(ZHttpRequest request) throws Exception { ????????????????// 設置發送請求的 header 信息 ????????????????request.addHeader("cookie", "abc=123;456=愛就是幸福;"); ????????????????// 配置要 POST 的數據 ????????????????MultipartEntityBuilder builder = request.getMultipartEntityBuilder(); ????????????????builder.addTextBody("p1", "abc"); ????????????????builder.addTextBody("p2", "中文", TEXT_PLAIN); ????????????????builder.addTextBody("p3", "abc中文cba", TEXT_PLAIN); ????????????????if (picPath != null && ! "".equals(picPath)) { ????????????????????builder.addTextBody("pic", picPath); ????????????????????builder.addBinaryBody("file", new File(picPath)); ????????????????} ????????????????request.buildPostEntity(); ????????????} ????????????@Override ????????????public String onSucceed(int statusCode, ZHttpRequest request) throws Exception { ????????????????return request.getInputStream(); ????????????} ????????????@Override ????????????public String onFailed(int statusCode, ZHttpRequest request) throws Exception { ????????????????return "POST 請求失敗:statusCode "+ statusCode; ????????????} ????????}); ????????TextView textView = (TextView) findViewById(R.id.showContent); ????????String content = "初始內容"; ????????try { ????????????if (view.getId() == R.id.doGet) { ????????????????content = get.get("http://www.baidu.com"); ????????????????content = "GET數據:isGet: " + (get.isGet() ? "yes" : "no") + " =>" + content; ????????????} else { ????????????????content = post.post("http://192.168.1.6/test.php"); ????????????????content = "POST數據:isPost" + (post.isPost() ? "yes" : "no") + " =>" + content; ????????????} ????????} catch (IOException e) { ????????????content = "IO異常:" + e.getMessage(); ????????} catch (Exception e) { ????????????content = "異常:" + e.getMessage(); ????????} ????????textView.setText(content); ????} ????public void doPhoto(View view) ????{ ????????destoryBimap(); ????????String state = Environment.getExternalStorageState(); ????????if (state.equals(Environment.MEDIA_MOUNTED)) { ????????????Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); ????????????startActivityForResult(intent, 1); ????????} else { ????????????Toast.makeText(MainActivity.this, "沒有SD卡", Toast.LENGTH_LONG).show(); ????????} ????} ????@Override ????protected void onActivityResult(int requestCode, int resultCode, Intent data) ????{ ????????Uri uri = data.getData(); ????????if (uri != null) { ????????????this.photo = BitmapFactory.decodeFile(uri.getPath()); ????????} ????????if (this.photo == null) { ????????????Bundle bundle = data.getExtras(); ????????????if (bundle != null) { ????????????????this.photo = (Bitmap) bundle.get("data"); ????????????} else { ????????????????Toast.makeText(MainActivity.this, "拍照失敗", Toast.LENGTH_LONG).show(); ????????????????return; ????????????} ????????} ????????FileOutputStream fileOutputStream = null; ????????try { ????????????// 獲取 SD 卡根目錄 ????????????String saveDir = Environment.getExternalStorageDirectory() + "/meitian_photos"; ????????????// 新建目錄 ????????????File dir = new File(saveDir); ????????????if (! dir.exists()) dir.mkdir(); ????????????// 生成文件名 ????????????SimpleDateFormat t = new SimpleDateFormat("yyyyMMddssSSS"); ????????????String filename = "MT" + (t.format(new Date())) + ".jpg"; ????????????// 新建文件 ????????????File file = new File(saveDir, filename); ????????????// 打開文件輸出流 ????????????fileOutputStream = new FileOutputStream(file); ????????????// 生成圖片文件 ????????????this.photo.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream); ????????????// 相片的完整路徑 ????????????this.picPath = file.getPath(); ????????????ImageView imageView = (ImageView) findViewById(R.id.showPhoto); ????????????imageView.setImageBitmap(this.photo); ????????} catch (Exception e) { ????????????e.printStackTrace(); ????????} finally { ????????????if (fileOutputStream != null) { ????????????????try { ????????????????????fileOutputStream.close(); ????????????????} catch (Exception e) { ????????????????????e.printStackTrace(); ????????????????} ????????????} ????????} ????} ????/** ?????* 銷毀圖片文件 ?????* ????private void destoryBimap() ????{ ????????if (photo != null && ! photo.isRecycled()) { ????????????photo.recycle(); ????????????photo = null; ????????} ????}*/ }


其中涉及到 scroll 滾動相關的事件,我一開始在這里折騰了好久,可以去看看我這篇文章:

Android 關于 OnScrollListener 事件順序次數的簡要分析



ZAsyncImageLoader.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 package com.ai9475.util; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReference; import java.net.HttpURLConnection; import java.net.URL; import java.util.Date; import java.util.HashMap; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** ?* 異步多線程加載圖片 ?* ?* Created by ZHOUZ on 14-2-7. ?*/ public class ZAsyncImageLoader { ????private static final String TAG = "ZAsyncImageLoader"; ????/** ?????* 線程池中的線程數量 ?????*/ ????private int mThreadSize = 5; ????/** ?????* 是否使用 SD 卡緩存圖片 ?????*/ ????private boolean mIsUseDiskCache = false; ????/** ?????* SD 卡上緩存的圖片有效期(單位:秒) ?????*/ ????private int mExpireTime = 86400; ????/** ?????* 圖片緩存文件目錄 ?????*/ ????private String mCachePath = null; ????/** ?????* 同步緩存已加載過的圖片,使用軟引用優化內存 ?????*/ ????private HashMap<string, softreference<drawable="">> mImageCaches = new HashMap<string, softreference<drawable="">>(); ????/** ?????* 使用線程池,根據 CPU 數量來動態決定可用線程數量 ?????*/ ????private ExecutorService mExecutorService = null; ????/** ?????* 設置 SD 卡中的圖片緩存有效時長(單位:秒) ?????* ?????* @param time ?????*/ ????public void setExpireTime(int time) { ????????this.mExpireTime = time; ????} ????/** ?????* 設置線程數量 ?????* ?????* @param size ?????*/ ????public void setThreadSize(int size) { ????????this.mThreadSize = size; ????} ????/** ?????* 設置是否使用 SD 卡緩存圖片 ?????* ?????* @param isUse ?????*/ ????public void setIsUseDiskCache(Boolean isUse) { ????????this.mIsUseDiskCache = isUse; ????} ????/** ?????* 設置緩存目錄 ?????* ?????* @param path ?????*/ ????public void setCacheDir(String path) { ????????this.mCachePath = path; ????} ????/** ?????* 獲取線程池管理器 ?????* ?????* @return ?????*/ ????public ExecutorService getExecutorService() { ????????if (this.mExecutorService == null) { ????????????if (this.mThreadSize < 1) { ????????????????this.mThreadSize = Runtime.getRuntime().availableProcessors() * 5; ????????????} ????????????this.mExecutorService = Executors.newFixedThreadPool(this.mThreadSize); ????????} ????????return this.mExecutorService; ????} ????/** ?????* 加載圖片的多線程控制 ?????* ?????* @param imageUrl ?????* @param tag ?????* @param listener ?????*/ ????public Drawable loadDrawable(final String imageUrl, final String tag, final OnImageLoadListener listener) ????{ ????????// 是否已緩存過圖片, 是則從緩存中直接獲取, 若緩存中數據丟失則重新遠程加載 ????????if (this.mImageCaches.containsKey(imageUrl)) { ????????????SoftReference<drawable> softReference = this.mImageCaches.get(imageUrl); ????????????if (softReference != null) { ????????????????Drawable drawable = softReference.get(); ????????????????if (drawable != null) { ????????????????????return drawable; ????????????????} ????????????} ????????} ????????// 異步多線程加載圖片后的數據傳遞處理 ????????final Handler handler = new Handler() { ????????????@Override ????????????public void handleMessage(Message message) { ????????????????if (message.what == 1) { ????????????????????listener.onLoaded((Drawable) message.obj, imageUrl, tag); ????????????????} else { ????????????????????listener.onFailed((IOException) message.obj, imageUrl, tag); ????????????????} ????????????} ????????}; ????????// 通過線程池來控制管理圖片加載 ????????this.getExecutorService().submit(new Runnable() { ????????????@Override ????????????public void run() { ????????????????Message msg; ????????????????try { ????????????????????Drawable drawable = loadImageFromUrl(imageUrl); ????????????????????mImageCaches.put(imageUrl, new SoftReference<drawable>(drawable)); ????????????????????msg = handler.obtainMessage(1, drawable); ????????????????} catch (IOException e) { ????????????????????msg = handler.obtainMessage(0, e); ????????????????} ????????????????handler.sendMessage(msg); ????????????} ????????}); ????????return null; ????} ????/** ?????* 加載遠程圖片或本地圖片緩存文件 ?????* ?????* @param imageUrl ?????* @return ?????* @throws IOException ?????*/ ????public Drawable loadImageFromUrl(String imageUrl) throws IOException ????{ ????????// 檢查 SD 卡是否可用并將圖片緩存到 SD 卡上 ????????if (mIsUseDiskCache && mCachePath != null) ????????{ ????????????File d = new File(mCachePath); ????????????if (! d.exists()) { ????????????????d.mkdirs(); ????????????} ????????????final File f = new File(mCachePath + ZHelper.md5(imageUrl)); ????????????long time = (new Date()).getTime(); ????????????long expire = time - (mExpireTime * 1000L); ????????????// 文件存在且在有效期內則直接讀取 ????????????if (f.exists() && f.lastModified() > expire) { ????????????????FileInputStream fis = new FileInputStream(f); ????????????????return Drawable.createFromStream(fis, "src"); ????????????} ????????????// 遠程加載圖片后寫入到 SD 卡上 ????????????InputStream i = this.getImageInputStream(imageUrl); ????????????if (i == null) { ????????????????return null; ????????????} ????????????final Drawable drawable = Drawable.createFromStream(i, "src"); ????????????// 將圖片異步寫入到本地 SD 卡中緩存, 避免阻塞UI線程, 導致圖片不能顯示 ????????????new Thread(new Runnable() { ????????????????@Override ????????????????public void run() { ????????????????????try { ????????????????????????InputStream i = ZFormat.drawable2InputStream(drawable); ????????????????????????DataInputStream in = new DataInputStream(i); ????????????????????????FileOutputStream out = new FileOutputStream(f); ????????????????????????byte[] buffer = new byte[1024]; ????????????????????????int byteRead; ????????????????????????while ((byteRead = in.read(buffer)) != -1) { ????????????????????????????out.write(buffer, 0, byteRead); ????????????????????????} ????????????????????????in.close(); ????????????????????????out.close(); ????????????????????} catch (IOException e) { ????????????????????????ZLog.d("write image cache IOException", e.getMessage()); ????????????????????????e.printStackTrace(); ????????????????????} ????????????????} ????????????}).start(); ????????????return drawable; ????????} ????????// 只讀取遠程圖片不緩存 ????????else { ????????????InputStream i = this.getImageInputStream(imageUrl); ????????????return Drawable.createFromStream(i, "src"); ????????} ????} ????/** ?????* 遠程加載圖片數據 ?????* ?????* @param imageUrl ?????* @return ?????* @throws IOException ?????*/ ????public InputStream getImageInputStream(String imageUrl) throws IOException ????{ ????????URL m = new URL(imageUrl); ????????HttpURLConnection conn = (HttpURLConnection) m.openConnection(); ????????conn.setRequestMethod("GET"); ????????conn.setUseCaches(false); ????????conn.setDoInput(true); ????????conn.setConnectTimeout(5000); ????????conn.setReadTimeout(30000); ????????conn.setInstanceFollowRedirects(true); ????????return conn.getInputStream(); ????} ????/** ?????* 加載圖片的事件監聽器 ?????*/ ????public interface OnImageLoadListener { ????????/** ?????????* 圖片加載完成事件處理 ?????????* ?????????* @param imageDrawable ?????????* @param imageUrl ?????????* @param tag ?????????*/ ????????public void onLoaded(Drawable imageDrawable, String imageUrl, String tag); ????????/** ?????????* 圖片加載失敗的事件處理 ?????????* ?????????* @param e ?????????* @param imageUrl ?????????* @param tag ?????????*/ ????????public void onFailed(IOException e, String imageUrl, String tag); ????} ????protected void finalize() ????{ ????????this.mExecutorService.shutdown(); ????} } </drawable></drawable></string,></string,>



DiaryListAdapter.java

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 package com.ai9475.meitian.adapter; import android.content.Context; import android.graphics.drawable.Drawable; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AlphaAnimation; import android.widget.AbsListView; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.ai9475.meitian.R; import com.ai9475.util.ZAsyncImageLoader; import com.ai9475.util.ZHelper; import com.ai9475.util.ZLog; import com.ai9475.util.ZUI; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** ?* Created by ZHOUZ on 14-2-8. ?*/ public class DiaryListAdapter extends BaseAdapter implements AbsListView.RecyclerListener { ????private static final String TAG = "DiaryListAdapter"; ????private Context mContext; ????private ListView mDiaryListView; ????public View mConvertView; ????private ZAsyncImageLoader mAsyncImageLoader; ????private JSONArray mDiaryDataList = null; ????private boolean mIsScrolling = false; ????private int mFirstPosition = 0; ????private int mLastPosition = 0; ????private int mPrevFirstPosition = 0; ????private int mPrevLastPosition = 0; ????private HashMap<string, integer=""> mImagesHeight = new HashMap<string, integer="">(); ????public DiaryListAdapter(Context context, ListView listView, ZAsyncImageLoader imageLoader, JSONArray diaryList) ????{ ????????this.mContext = context; ????????this.mAsyncImageLoader = imageLoader; ????????this.mDiaryDataList = diaryList; ????????this.mDiaryListView = listView; ????} ????public void setIsSCrolling(boolean flag) ????{ ????????this.mIsScrolling = flag; ????} ????/** ?????* 當前列表加載到的日記總數 ?????* ?????* @return ?????*/ ????public int getCount() { ????????return this.mDiaryDataList == null ? 0 : this.mDiaryDataList.length(); ????} ????/** ?????* 可見單元位置對比是否處在在上次滾動可是范圍內 ?????* ?????* @param position ?????* @return ?????*/ ????public boolean isInPrevPositionRange(int position) { ????????// 初始化時直接返回 false ????????if (this.mPrevLastPosition == 0) return false; ????????// 檢測當前 item 的位置是否在上次滾動范圍內, 是則表示該 item 正處于屏幕可見狀態中無需重新加載 ????????return (position >= this.mPrevFirstPosition && position <= this.mPrevLastPosition) ? true : false; ????} ????/** ?????* 設置滾動后可見的起止項目序號 ?????* ?????* @param first ?????* @param last ?????*/ ????public void setPositionRange(int first, int last) { ????????// 保存上次滾動后的可見位置 ????????this.mPrevFirstPosition = this.mFirstPosition; ????????this.mPrevLastPosition = this.mLastPosition; ????????// 重置當前可見位置 ????????this.mFirstPosition = first; ????????this.mLastPosition = last; ????????ZLog.i(TAG, "setPositionLimit prevFirst: "+ mPrevFirstPosition +", prevLast: "+ mPrevLastPosition +", first: "+ mFirstPosition +", last: "+ mLastPosition); ????} ????/** ?????* 獲取當前列表單元的日記id ?????* ?????* @param position ?????* @return ????*/ ????public long getItemId(int position) { ????????int id = 0; ????????try { ????????????id = this.getItem(position).getInt("id"); ????????} catch (JSONException e) { ????????????Toast.makeText(this.mContext, e.getMessage(), Toast.LENGTH_LONG); ????????} ????????return id; ????} ????/** ?????* 獲取一條數據 ?????* ?????* @param position ?????* @return ?????*/ ????public JSONObject getItem(int position) { ????????return (JSONObject) this.mDiaryDataList.opt(position); ????} ????/** ?????* 獲取視圖 ?????* ?????* @param position ?????* @param convertView ?????* @param parent ?????* @return ?????*/ ????public View getView(int position, View convertView, ViewGroup parent) ????{ ????????ZLog.v(TAG, "getView i: " + position); ????????final ViewHolder holder; ????????if (convertView == null) { ????????????convertView = LayoutInflater.from(this.mContext).inflate(R.layout.list_item_diary, null); ????????????this.mConvertView = convertView; ????????????holder = new ViewHolder(convertView); ????????????convertView.setTag(holder); ????????} else { ????????????holder = (ViewHolder) convertView.getTag(); ????????} ????????try { ????????????// 獲取當前列表單元的 JSON 日記數據 ????????????JSONObject item = this.getItem(position); ????????????ZLog.i(TAG, "getView i: "+ position +", isScrolling: "+ mIsScrolling +", mFirstPosition: "+ mFirstPosition +", mLastPosition: "+ mLastPosition); ????????????/*if (! isScrolling && (position >= mFirstPosition && position <= mLastPosition)) { ????????????????ZLog.i(TAG, "getView i: "+ position +", show images"); ????????????????this.loadImage(holder.picPhoto, holder.avatar, item); ????????????} else {*/ ????????????????ZLog.i(TAG, "getView i: "+ position +", can't show images"); ????????????// 初始化時自動加載 ????????????if (this.mLastPosition == 0) { ????????????????this.loadImage(holder.picPhoto, holder.avatar, item); ????????????????this.mPrevLastPosition = position; ????????????} else { ????????????????this.setDefaultImage(holder.picPhoto, holder.avatar, item); ????????????} ????????????????/*holder.picPhoto.setScaleType(ImageView.ScaleType.CENTER); ????????????????holder.picPhoto.setImageResource(R.drawable.default_pic); ????????????????holder.avatar.setScaleType(ImageView.ScaleType.CENTER); ????????????????holder.avatar.setImageResource(R.drawable.default_avatar); ????????????}*/ ????????????holder.nickname.setText(item.getString("nickname") +":"+ position); ????????????holder.content.setText(item.getString("content")); ????????????holder.calendarMonth.setText(ZHelper.dateFormat("MM月", item.getInt("calendarDate"))); ????????????holder.calendarDay.setText(ZHelper.dateFormat("dd", item.getInt("calendarDate"))); ????????} catch (JSONException e) { ????????????Toast.makeText(this.mContext, e.getMessage(), Toast.LENGTH_LONG); ????????} ????????return convertView; ????} ????public void setDefaultImage(ImageView picPhoto, ImageView avatar, JSONObject item) throws JSONException ????{ ????????int height = 0; ????????String picUrl = getPicUrl(item.getString("picUrl")); ????????if (mImagesHeight.containsKey(picUrl)) { ????????????height = mImagesHeight.get(picUrl); ????????} ????????int minHeight = ZUI.dp2px(this.mContext, 100); ????????if (height < minHeight) height = minHeight; ????????picPhoto.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); ????????picPhoto.setScaleType(ImageView.ScaleType.CENTER); ????????picPhoto.setImageResource(R.drawable.default_pic); ????????avatar.setScaleType(ImageView.ScaleType.CENTER); ????????avatar.setImageResource(R.drawable.default_avatar); ????} ????public String getPicUrl(String pic) ????{ ????????return "http://img.ai9475.com/data/attachment/images/meitian/" + pic; ????} ????public String getAvatarUrl(String avatar) ????{ ????????return "http://img.ai9475.com/data/attachment/images/avatar/" + avatar; ????} ????/** ?????* 加載可見單元的圖片 ?????* ?????* @param picPhoto ?????* @param avatar ?????* @param item ?????* @throws JSONException ?????*/ ????public void loadImage(ImageView picPhoto, ImageView avatar, JSONObject item) throws JSONException ????{ ????????// 圖片鏈接 ????????String picUrl = getPicUrl(item.getString("picUrl")); ????????String avatarUrl = getAvatarUrl(item.getString("avatar")); ????????// 記錄異步加載的圖片標簽 ????????String picTag = "pic"+ item.getInt("calendarDate") + item.getInt("id"); ????????String avatarTag = "avatar"+ item.getInt("id"); ????????picPhoto.setTag(picTag); ????????avatar.setTag(avatarTag); ????????OnPicLoadListener mOnPicLoadListener = new OnPicLoadListener(); ????????OnAvatarLoadListener mOnAvatarLoadListener = new OnAvatarLoadListener(); ????????// 異步加載遠程日記照片或緩存 ????????Drawable picDrawable = this.mAsyncImageLoader.loadDrawable(picUrl, picTag, mOnPicLoadListener); ????????// 存在緩存則使用緩存中的圖片資源或者使用默認占位圖 ????????mOnPicLoadListener.setDrawable(picPhoto, picUrl, picTag, picDrawable); ????????// 異步加載遠程用戶頭像或加載緩存 ????????Drawable avatarDrawable = this.mAsyncImageLoader.loadDrawable(avatarUrl, avatarTag, mOnAvatarLoadListener); ????????// 存在緩存則使用緩存中的圖片資源或者使用默認占位圖 ????????mOnAvatarLoadListener.setDrawable(avatar, avatarUrl, avatarTag, avatarDrawable); ????} ????/** ?????* 當列表單元滾動到可是區域外時清除掉已記錄的圖片視圖 ?????* ?????* @param view ?????*/ ????@Override ????public void onMovedToScrapHeap(View view) { ????????/*ViewHolder holder = (ViewHolder) view.getTag(); ????????this.imageViews.remove(holder.avatar); ????????this.imageViews.remove(holder.picPhoto);*/ ????} ????private static class ViewHolder ????{ ????????public ImageView picPhoto; ????????public ImageView avatar; ????????public TextView nickname; ????????public TextView content; ????????public TextView calendarMonth; ????????public TextView calendarDay; ????????public ViewHolder(View view) ????????{ ????????????this.picPhoto = (ImageView) view.findViewById(R.id.picPhoto); ????????????this.avatar = (ImageView) view.findViewById(R.id.avatar); ????????????this.nickname = (TextView) view.findViewById(R.id.nickname); ????????????this.content = (TextView) view.findViewById(R.id.content); ????????????this.calendarMonth = (TextView) view.findViewById(R.id.calendarMonth); ????????????this.calendarDay = (TextView) view.findViewById(R.id.calendarDay); ????????} ????} ????/** ?????* 頭像圖片加載事件監聽 ?????*/ ????private class OnAvatarLoadListener extends OnImageLoadListener ????{ ????????private int mImageSource = R.drawable.default_avatar; ????????/** ?????????* 設置圖片 ?????????* ?????????* @param view ?????????* @param imageUrl ?????????* @param tag ?????????* @param drawable ?????????*/ ????????public void setDrawable(ImageView view, String imageUrl, String tag, Drawable drawable) ????????{ ????????????if (view == null) return; ????????????if (drawable != null) { ????????????????view.setScaleType(ImageView.ScaleType.CENTER_CROP); ????????????????view.setImageDrawable(drawable); ????????????} else { ????????????????view.setScaleType(ImageView.ScaleType.CENTER); ????????????????view.setImageResource(this.mImageSource); ????????????} ????????} ????} ????/** ?????* 日記照片加載事件監聽 ?????*/ ????private class OnPicLoadListener extends OnImageLoadListener ????{ ????????private int mImageSource = R.drawable.default_pic; ????????/** ?????????* 設置圖片 ?????????* ?????????* @param view ?????????* @param imageUrl ?????????* @param tag ?????????* @param drawable ?????????*/ ????????public void setDrawable(ImageView view, String imageUrl, String tag, Drawable drawable) ????????{ ????????????if (view == null) return; ????????????int height = 0; ????????????if (mImagesHeight.containsKey(imageUrl)) { ????????????????height = mImagesHeight.get(imageUrl); ????????????} ????????????if (drawable != null) { ????????????????// 定義圖片的最佳高度 ????????????????if (height == 0) { ????????????????????int minHeight = ZUI.dp2px(mContext, 100); ????????????????????int maxHeight = ZUI.dp2px(mContext, 300); ????????????????????height = (int) ((float) view.getWidth() / drawable.getMinimumWidth() * drawable.getMinimumHeight()); ????????????????????if (height > maxHeight) { ????????????????????????height = maxHeight; ????????????????????} else if (height < minHeight) { ????????????????????????height = minHeight; ????????????????????} ????????????????????mImagesHeight.put(imageUrl, height); ????????????????} ????????????????// 現將圖片完全透明 ????????????????drawable.setAlpha(0); ????????????????view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); ????????????????view.setScaleType(ImageView.ScaleType.CENTER_CROP); ????????????????view.setImageDrawable(drawable); ????????????????// 添加透明漸變動畫顯示圖片 ????????????????AlphaAnimation alphaAnim = new AlphaAnimation(0.0f, 1.0f); ????????????????alphaAnim.setDuration(1000); ????????????????view.setAnimation(alphaAnim); ????????????} else { ????????????????int minHeight = ZUI.dp2px(mContext, 100); ????????????????height = height < minHeight ? minHeight : height; ????????????????view.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, height)); ????????????????view.setScaleType(ImageView.ScaleType.CENTER); ????????????????view.setImageResource(mImageSource); ????????????} ????????} ????} ????/** ?????* 圖片的加載監聽事件 ?????*/ ????abstract private class OnImageLoadListener implements ZAsyncImageLoader.OnImageLoadListener ????{ ????????/** ?????????* 實現圖片顯示的抽象方法 ?????????* ?????????* @param view ?????????* @param tag ?????????* @param drawable ?????????*/ ????????abstract public void setDrawable(ImageView view, String imageUrl, String tag, Drawable drawable); ????????@Override ????????public void onLoaded(Drawable drawable, String imageUrl, String tag) { ????????????ImageView view = (ImageView) mDiaryListView.findViewWithTag(tag == null ? imageUrl : tag); ????????????this.setDrawable(view, imageUrl, tag, drawable); ????????} ????????@Override ????????public void onFailed(IOException e, String imageUrl, String tag) { ????????????//Toast.makeText(mContext, e.toString(), Toast.LENGTH_SHORT).show(); ????????} ????} }</string,></string,>


代碼相關的一些類方法,以及涉及到的其他方面問題的相關博文:

android 一些數據轉換方法

Android實現圖片寬度100%ImageView寬度且高度按比例自動伸縮


源碼:http://yunpan.cn/QpzhBEWCw3gDH

項目中需要修改服務端的地址,我在壓縮包中附有一些 服務端發送的 JSON 數據


還可以加入 Android 文件共享群,這里全是 Android 和 JAVA 學習資料和教程:http://qun.yunpan.360.cn/38063538

轉載于:https://www.cnblogs.com/pricks/p/3921625.html

總結

以上是生活随笔為你收集整理的Android之ListView异步加载图片且仅显示可见子项中的图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久久久国产精品久久久 | 国产专区欧美专区 | 国产黄色资源 | 日韩av一区二区在线影视 | 精品久久网 | 日日夜夜天天久久 | 欧美综合色 | 日韩a级黄色片 | 2020天天干夜夜爽 | 成人一级在线 | 久久色视频 | 最新av在线网站 | 成人免费在线观看电影 | 亚洲精品乱码久久久久久蜜桃不爽 | 一区二区成人国产精品 | 国产精品96久久久久久吹潮 | 麻花豆传媒mv在线观看 | 久久久久国 | 亚洲精品玖玖玖av在线看 | 精品成人在线 | 国产精美视频 | www.久久久com | 国产一区二区精品91 | 免费观看一区二区三区视频 | 精品在线小视频 | 精品视频免费 | 日韩三级精品 | 欧美成人h版 | 日日爱网站 | 亚洲精品一区二区三区在线观看 | 天天干国产| 中文字幕免费高清在线观看 | 波多野结衣一区二区三区中文字幕 | 欧洲亚洲激情 | 欧美91片 | 91九色视频导航 | 亚州精品天堂中文字幕 | av高清免费在线 | 高清视频一区二区三区 | 808电影免费观看三年 | 久草资源在线观看 | 日韩一级片大全 | 91麻豆视频 | 日韩专区中文字幕 | 亚洲精品久久视频 | 超碰97免费在线 | 高清av免费看 | av网站大全免费 | 国产 中文 日韩 欧美 | 国产资源免费在线观看 | 区一区二在线 | 国产一区二区三区黄 | 日韩欧美视频一区二区 | av综合网址 | 波多野结衣精品在线 | 国产成人99久久亚洲综合精品 | 久久午夜精品 | 久久久久97国产 | 三级a视频 | 欧美一级xxxx | 久久国产成人午夜av影院潦草 | 亚洲撸撸| 亚洲国产精品成人av | 激情五月激情综合网 | 人人玩人人爽 | 免费观看91 | 九月婷婷综合网 | 奇米影视777四色米奇影院 | 久操伊人 | 久久香蕉一区 | 天天操天天干天天插 | 国产精品99久久久久久小说 | 17婷婷久久www | 久草免费在线观看 | 手机看片中文字幕 | 国产 欧美 日韩 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 韩日av一区二区 | 国产99久久精品一区二区永久免费 | 久久国产精品成人免费浪潮 | 久久精品观看 | 久久天天躁狠狠躁夜夜不卡公司 | 国产精品乱码在线 | 国产麻豆成人传媒免费观看 | 久久久久久久久久久久久久电影 | av线上免费看| 日韩经典一区二区三区 | 五月天六月丁香 | 综合久久久久久久 | 91入口在线观看 | 天天综合网~永久入口 | 日韩黄色免费在线观看 | 中文字幕一区二区三区在线播放 | 国产精在线 | 国产精品一区二区三区在线看 | 在线视频 你懂得 | a特级毛片 | 精品亚洲二区 | 美腿丝袜av | 在线91av| 欧美小视频在线观看 | 精品久久久久久久久久久院品网 | 日韩精品视频在线观看网址 | 粉嫩高清一区二区三区 | 99热精品久久 | 韩国av免费在线观看 | 男女精品久久 | 中文字幕在线观看完整版 | www.久草视频 | 狠狠狠狠狠狠狠干 | 国语精品免费视频 | 伊人久久影视 | 精品久久综合 | 久久综合久久综合久久综合 | 伊人首页| 在线观看视频色 | 国产一卡二卡四卡国 | 97超碰在线人人 | 国产精品免费观看在线 | 亚洲天天综合 | 不卡av电影在线观看 | 一区二区三区视频在线 | 人人射av| 九九九九热精品免费视频点播观看 | 激情www| 久久久穴 | a色视频| 国产色在线观看 | 久久婷婷一区二区三区 | 国产精品va最新国产精品视频 | 国产日本在线观看 | 一本一道波多野毛片中文在线 | 国产精品久久久久影视 | 国产视频一区在线免费观看 | 国产极品尤物在线 | 一区二区三区在线影院 | 国产aa免费视频 | 超级碰碰免费视频 | 亚洲天堂网在线视频 | 综合色影院 | 91精品国产99久久久久 | 最新国产视频 | 国产亚洲精品av | 最近日韩免费视频 | 久久免费视频在线观看30 | 久草在线费播放视频 | 国产一区二区三区免费在线观看 | 久草在线网址 | 狠狠躁夜夜躁人人爽视频 | 97国产在线观看 | 久久久精品国产免费观看一区二区 | 日韩在线观看视频网站 | 天天综合日日夜夜 | 天天综合网久久 | 亚洲日本va中文字幕 | 亚洲人人av | 偷拍精品一区二区三区 | 国产一级片久久 | 国产精品99免视看9 国产精品毛片一区视频 | 丁香综合激情 | 久久久久精 | 国产免费大片 | 九九热99视频 | 欧美日韩一区二区三区免费视频 | 中文字幕在线免费观看 | 片网站| 亚洲国产电影在线观看 | 最新av中文字幕 | 日韩av一区在线观看 | 日本免费久久高清视频 | 国产精品久久久 | 国产精品永久免费视频 | 欧美aⅴ在线观看 | 91在线精品秘密一区二区 | 久久久久久久久久久影院 | 国产精品 美女 | av电影在线观看完整版一区二区 | 视频在线观看国产 | 五月婷婷开心中文字幕 | 日韩美在线观看 | 国产黄大片| 蜜臀av性久久久久蜜臀aⅴ流畅 | 少妇bbbb揉bbbb日本 | 在线黄色免费av | 久久久久成 | 久久大片网站 | 九九热在线精品视频 | 国产精品视频免费 | 五月婷婷综合色拍 | 国产激情小视频在线观看 | 韩国一区在线 | 精品亚洲一区二区三区 | 91免费版在线 | 国产特级毛片aaaaaa | 狠狠色狠狠综合久久 | av综合 日韩 | 色在线视频网 | 91成人免费电影 | 日韩中文字幕免费电影 | 手机av电影在线观看 | 午夜精品久久久久久久99 | 欧美一级片免费观看 | 美女国内精品自产拍在线播放 | 久久呀| 亚洲黄色免费在线看 | 免费观看黄色12片一级视频 | 在线中文字幕视频 | 欧美日韩91 | 日韩在线电影一区二区 | 国产精品69av | 精品成人a区在线观看 | 人人澡人人爽欧一区 | 91日韩在线播放 | 日韩视频一区二区 | 成人高清av在线 | 亚洲欧洲精品视频 | 亚洲九九九在线观看 | 中文字幕中文中文字幕 | 91传媒在线看 | 国产日韩精品在线 | 久久av电影| 成人资源在线观看 | 国产不卡视频 | 一区二区三区在线观看中文字幕 | 中文有码在线视频 | 91成人网页版 | av中文字幕在线电影 | 天天五月天色 | 久久人91精品久久久久久不卡 | 日韩精品国产一区 | 久久高视频| 久久精品久久久久久久 | 国产精品久久久毛片 | 亚洲综合射 | 2021国产精品视频 | 99在线高清视频在线播放 | 国产资源网站 | 精品视频亚洲 | 中文字幕 第二区 | www激情网 | 日韩网站中文字幕 | 99视频在线精品国自产拍免费观看 | 91免费看黄色 | 免费观看第二部31集 | 人人射av | 天天操天天综合网 | 国产亚洲成人精品 | 国产精品刺激对白麻豆99 | 99久久久久久国产精品 | 国产精品一区在线播放 | 四虎影视8848aamm| 日本特黄一级 | 日韩av片无码一区二区不卡电影 | 一区二区三区电影在线播 | 色综合久久久久久中文网 | 91在线麻豆 | 九九免费视频 | 国产成人精品一区二区三区在线 | 精品免费| 欧美日韩国产精品久久 | 日本夜夜草视频网站 | 久久 一区 | 亚洲成人黄色网址 | 国产精品99免视看9 国产精品毛片一区视频 | 在线亚洲精品 | 日韩电影中文字幕在线 | 午夜视频一区二区 | 欧美性护士 | 日韩综合第一页 | 国产精品久久久久久久av大片 | 狠狠躁日日躁 | 99久久99久久精品国产片果冰 | 国产拍在线 | 中文区中文字幕免费看 | 在线视频 区 | 国产成人在线精品 | 免费观看的黄色片 | .国产精品成人自产拍在线观看6 | 免费看黄网站在线 | 天堂中文在线播放 | 免费日韩电影 | 草莓视频在线观看免费观看 | 欧美一级电影免费观看 | 欧美日韩在线免费视频 | 色六月婷婷 | 亚洲精品黄网站 | 日本一区二区不卡高清 | 免费看片成年人 | 亚洲一区尤物 | 91亚洲激情 | 久久精品96| 国产成人精品久久亚洲高清不卡 | 9在线观看免费高清完整版 玖玖爱免费视频 | 成人av电影免费在线观看 | 日本狠狠色 | 日韩欧美在线综合网 | 99热精品国产一区二区在线观看 | 国产亚州精品视频 | 91大神电影 | 日韩在线观看你懂的 | 亚洲精品在线观看av | 91大神视频网站 | 日本久久久久久久久久 | 欧美在线视频一区二区三区 | 免费视频91蜜桃 | 日韩精品一区二区在线视频 | 亚洲精品免费在线观看视频 | 伊人狠狠操 | 97视频人人免费看 | 成人免费色 | av在线免费观看网站 | 日本精品一二区 | 欧美日韩国产精品一区二区亚洲 | 丁香六月色 | 成人va在线观看 | 午夜国产福利在线观看 | 欧美在线视频不卡 | 美州a亚洲一视本频v色道 | 久久免费的精品国产v∧ | 亚洲成人精品在线观看 | 久久精品第一页 | 91中文字幕 | 亚洲精品成人av在线 | 丁香婷婷综合色啪 | 精品影院| 免费黄av | 手机在线观看国产精品 | 成人中文字幕在线 | 伊人影院99 | 精品福利视频在线 | 日日碰狠狠添天天爽超碰97久久 | 亚洲精品在线免费看 | 中国美女一级看片 | 97视频播放 | 久久99网站 | 日韩二区在线观看 | 日韩成人中文字幕 | 国产又粗又猛又黄又爽 | www四虎影院 | 国产在线一线 | 波多野结衣视频一区二区三区 | 久久精品这里热有精品 | 中文字幕一区二区三区在线播放 | 久久精品中文字幕 | 狠狠操夜夜| 亚洲免费视频在线观看 | 黄色av大片 | 久久国产麻豆 | 亚洲精品网站在线 | 最新91在线视频 | 色九九视频 | 好看av在线| 亚州精品成人 | 久草在线综合网 | 亚洲成人av免费 | 免费看国产一级片 | 国产91精品一区二区麻豆亚洲 | 最近最新mv字幕免费观看 | 国产福利在线免费观看 | 久久国产电影 | 超碰在线9 | 极品美女被弄高潮视频网站 | 亚洲国产成人久久综合 | 9i看片成人免费看片 | 成人免费视频观看 | 欧美精品一区二区三区一线天视频 | 丁香六月在线观看 | 日本精品一 | 日韩欧美视频二区 | 久久久久久久久久久免费视频 | 视频国产精品 | 久久久黄色 | 亚洲丁香久久久 | av免费观看网址 | 精品国产成人av在线免 | 久久精品在线 | 在线观看成人毛片 | 99精品国产一区二区三区不卡 | 日本激情视频中文字幕 | 午夜视频日本 | 国产福利久久 | 久久久久久国产精品久久 | 手机看国产毛片 | 成人av电影免费 | a色视频 | 欧美激情精品久久久 | 一区二区三区视频网站 | av电影在线不卡 | 激情五月开心 | 天天爱天天射天天干天天 | 欧美一级电影免费观看 | 欧美日韩国产页 | 伊人宗合网 | 日韩精品视频免费专区在线播放 | 一区二区三区在线免费播放 | 色多多污污 | 超碰999| 在线免费观看涩涩 | 国精产品一二三线999 | 五月天亚洲精品 | 久久视频这里有久久精品视频11 | 欧美久久九九 | 91香蕉视频 | 国产麻豆精品在线观看 | 一区二区三区日韩在线 | 久久露脸国产精品 | 欧美日本在线视频 | 午夜精品福利影院 | 91精品福利在线 | 国产一级视屏 | 欧美日韩国产综合一区二区 | 在线观看亚洲专区 | 婷五月激情| 天天色视频 | 91人人爽久久涩噜噜噜 | 久久九九国产精品 | 一区二区三区日韩精品 | 亚洲综合成人专区片 | 在线v片 | 亚洲激情影院 | 日韩精品久久久久久 | 久热爱| 久久成人国产 | 91精品啪在线观看国产81旧版 | 99久久久久国产精品免费 | 西西444www大胆高清图片 | 亚洲高清在线视频 | 69国产精品视频 | 九九欧美视频 | 亚洲免费色| 国产精品一区电影 | 在线91观看| 中文字幕日本在线观看 | 国产午夜精品福利视频 | 在线播放你懂 | 欧美日bb | 国产电影一区二区三区四区 | 黄色福利网 | 国产黄色片免费看 | 免费看一及片 | 激情小说 五月 | 69亚洲视频| 日韩理论电影在线观看 | www.eeuss影院av撸| wwwav视频| 香蕉视频在线看 | 国产黄色精品在线观看 | 久久人人爽人人片av | 亚洲综合在线视频 | 色婷婷五 | 97在线观 | 亚洲精品久久久久久久蜜桃 | 中文在线www | 激情五月婷婷综合网 | 国产精品乱码一区二区视频 | 国产精品久久久久久久久久免费看 | 久久男人影院 | 午夜骚影 | jizz18欧美18 | 午夜精品久久久久久久久久久久 | 人人讲 | 最近能播放的中文字幕 | 免费看91的网站 | 99视频黄 | 婷婷av电影 | 2018亚洲男人天堂 | 最近中文字幕免费av | 欧美大荫蒂xxx | 国产aaa毛片 | 国产美腿白丝袜足在线av | 99产精品成人啪免费网站 | 美女视频国产 | 九九在线视频 | 国产破处视频在线播放 | 久久精品99国产精品酒店日本 | 欧美成人亚洲 | 欧美另类视频 | 麻豆av一区二区三区在线观看 | 91视频大全 | 婷婷丁香自拍 | 久久国产精品第一页 | 欧美亚洲国产一卡 | 97视频亚洲 | 欧美日韩精品免费观看视频 | 五月天欧美精品 | 国产999精品久久久久久麻豆 | 久久久久久草 | 久久婷婷一区 | 综合影视| 午夜丁香网 | 国产精品免费久久久久 | 欧美夫妻生活视频 | 国产破处在线播放 | 四虎www. | 97在线观看免费高清 | 特及黄色片 | 亚洲一区日韩精品 | 日韩精品综合在线 | 四虎在线视频免费观看 | 日韩黄色在线电影 | 顶级bbw搡bbbb搡bbbb | 日本黄色一级电影 | 日韩在线 一区二区 | 免费视频黄 | 久久精品91视频 | 婷婷色资源 | 一区二区电影在线观看 | 久久久午夜精品理论片中文字幕 | 黄色软件在线观看 | 国产黄色看片 | 又黄又刺激又爽的视频 | 国产精品1区2区 | 国产一区二区在线观看免费 | www.99在线观看 | 日韩专区 在线 | 日韩伦理一区二区三区av在线 | 91午夜精品 | 成人免费观看在线视频 | 成人久久18免费网站麻豆 | 久久黄色成人 | 国产精品黑丝在线观看 | 欧美日在线 | 日韩欧美在线播放 | 欧美a级在线免费观看 | 美女网站视频色 | 免费高清在线观看成人 | 天天操天天摸天天射 | 黄色小说视频网站 | 亚洲精品免费在线视频 | 国产黄色免费电影 | 日韩电影在线观看一区二区 | 国产69久久久欧美一级 | 亚洲成人精品在线 | 韩日三级av | 国产精品久久一区二区无卡 | 97视频资源 | 欧美吞精| 伊人成人久久 | 久久国产免费 | 国产亚洲日本 | 成人全视频免费观看在线看 | 中文字幕日本在线 | 欧美最猛性xxxxx亚洲精品 | 国产一区视频免费在线观看 | 美女网色 | 午夜美女网站 | 国产精品孕妇 | 欧美日韩不卡一区二区三区 | 国产免费av一区二区三区 | 日韩在线视频播放 | 亚洲国产精品99久久久久久久久 | www.夜色321.com| 天天射天天射天天射 | 亚洲一本视频 | 黄色的视频网站 | 天天干视频在线 | 亚洲丝袜一区二区 | 激情丁香婷婷 | 久久av网 | 成人av在线资源 | 免费高清看电视网站 | 久久久人人爽 | 亚洲精品乱码久久久久久蜜桃91 | 高清在线一区二区 | 99视频这里有精品 | 免费看污片 | 日韩网站免费观看 | 91av视频观看 | 国产精品一区二区在线观看免费 | 欧美精品一区在线发布 | 日韩一区二区三区免费电影 | 国产精品视频永久免费播放 | 国产成人黄色网址 | 99这里只有久久精品视频 | 99综合电影在线视频 | 欧美日韩国语 | 成人小视频在线观看免费 | 三级黄色网址 | 97视频在线免费播放 | 国产人成在线视频 | 亚洲综合黄色 | 高清av免费看 | 国产专区在线视频 | 叶爱av在线| 久久久18 | 中文字幕日本在线 | 日韩免费观看一区二区三区 | 99久久激情视频 | 亚洲狠狠丁香婷婷综合久久久 | 中文网丁香综合网 | 精品国产乱码久久久久久1区二区 | 99久久www免费 | 97狠狠操| 91毛片在线| 亚洲永久精品在线 | 国产精品乱码久久 | 免费观看av | 色婷婷久久 | 中文字幕一区二区三区久久 | 精品一区二区免费视频 | 91在线产啪 | 国语对白少妇爽91 | 国产不卡视频在线 | 韩日精品在线 | 久草在线高清视频 | 日韩在线免费视频观看 | 97偷拍视频 | 国产中文在线字幕 | 国产va饥渴难耐女保洁员在线观看 | 久久成人视屏 | 男女日麻批 | 日韩欧美一二三 | 国产一二三区av | 日本中文字幕在线免费观看 | 午夜国产一区二区三区四区 | 国产 一区二区三区 在线 | 丁香六月在线 | av再线观看 | 91九色成人蝌蚪首页 | 有码中文字幕在线观看 | 亚洲精品综合久久 | 国产99久久久国产精品 | 深爱综合网 | 亚洲精品久久久久久中文传媒 | a v在线视频 | 综合久久综合久久 | 亚洲成av人片一区二区梦乃 | 国产精品一区二区无线 | 中文亚洲欧美日韩 | 一区二区三区四区在线 | 婷婷视频在线 | 欧美人牲 | 国产精品久久久久免费观看 | 日韩精品一区二区免费 | 狠狠色伊人亚洲综合成人 | 免费看的黄色录像 | 91av在| 国产精品亚洲人在线观看 | 日韩免费不卡av | 99热.com| 久草久视频 | 欧美日韩中文国产一区发布 | 国产精品第72页 | 国产精品一区二区三区在线免费观看 | 午夜精品三区 | 97人人人| 一区在线播放 | 国产91精品一区二区麻豆亚洲 | 亚洲综合导航 | 最新av在线网址 | 久久九九国产精品 | 久久曰视频 | 91精品久久久久 | 婷婷去俺也去六月色 | 国产永久免费观看 | av一区在线 | 九九精品毛片 | 久久久久国产成人免费精品免费 | av手机版| 久久噜噜少妇网站 | 精品久久久久久久久久久久久久久久久久 | 久草在线看片 | 久热av| 热热热热热色 | 麻豆高清免费国产一区 | 亚洲欧美视频在线 | 欧美国产亚洲精品久久久8v | 日本精品久久久久中文字幕 | 精品黄色在线观看 | 欧美极品xxxxx | 国产又粗又猛又黄又爽的视频 | 国产一区二区三区免费在线 | 美女网站在线播放 | 五月婷婷播播 | 亚洲91精品在线观看 | 国产拍在线| 国产美女黄网站免费 | 日韩大片在线 | 亚洲一级电影在线观看 | a成人v| 一区二区影院 | 欧美在线观看小视频 | 成人在线免费视频观看 | 欧美日韩一区二区久久 | 午夜精品福利一区二区三区蜜桃 | 精品国内自产拍在线观看视频 | 欧美日韩一区二区在线观看 | 黄色av在| 日韩理论在线视频 | 欧美日在线观看 | 丁香花在线视频观看免费 | 久久久久看片 | 国产黄色一级片 | 色综合久久悠悠 | 亚洲国产经典视频 | 激情五月色播五月 | 四川妇女搡bbbb搡bbbb搡 | 成 人 黄 色视频免费播放 | 亚洲精品午夜aaa久久久 | 日日日干 | 青草视频在线看 | 久久这里有精品 | 中文字幕国产精品一区二区 | 中文字幕色在线 | 日本黄色免费网站 | 欧美一区免费在线观看 | 国产精品一区二区免费 | 天天干天天射天天插 | 久久综合久久久 | 西西444www大胆高清图片 | 日韩有码专区 | 国产在线a| 91精品一区二区在线观看 | 欧美久久久久久久久中文字幕 | 蜜臀久久99精品久久久无需会员 | 久久婷婷国产色一区二区三区 | 日韩www在线 | 日韩一二区在线观看 | 91av原创| 视频国产一区二区三区 | 亚洲欧美日韩在线看 | 精品亚洲视频在线观看 | 高清av影院 | 欧美 日韩 久久 | 粉嫩一区二区三区粉嫩91 | 九九爱免费视频在线观看 | 深夜免费福利视频 | 国产在线观看午夜 | 亚洲久草网 | 婷婷性综合 | www.av免费 | 日本免费一二三区 | 久久久久五月天 | 天堂中文在线播放 | 日韩欧美在线观看一区二区 | 97av在线视频免费播放 | 香蕉网站在线观看 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 国产日韩视频在线 | 九九日九九操 | 国产一级高清视频 | 黄色a在线观看 | 人人爱爱 | 人人干人人干人人干 | 中文字幕中文 | 狠狠地日 | 99国产精品免费网站 | 久久69精品久久久久久久电影好 | 夜夜骑日日| 国产精品欧美一区二区 | 激情五月婷婷激情 | 久久久精品久久日韩一区综合 | 日韩69av | 96精品高清视频在线观看软件特色 | 蜜臀久久99精品久久久酒店新书 | 成人av网站在线观看 | 久久成人国产精品 | 久久久亚洲影院 | 91一区啪爱嗯打偷拍欧美 | 亚洲三级在线播放 | 久久视频精品在线观看 | 亚洲精品在线观看网站 | 日日草av | 国产美女精品视频 | 亚洲国产精品一区二区久久,亚洲午夜 | 婷婷成人在线 | 麻豆视频免费播放 | 另类五月激情 | 综合网色 | 特级西西人体444是什么意思 | 99久久99久久免费精品蜜臀 | 99在线免费观看视频 | av三级av | 国产一级黄色片免费看 | 国内精品视频免费 | 中文字幕免费久久 | 在线观看视频你懂的 | 亚洲国产成人在线观看 | 亚洲国产精品电影 | 欧美午夜精品久久久久久孕妇 | 午夜在线免费观看视频 | 在线视频第一页 | 在线观看亚洲国产精品 | 三三级黄色片之日韩 | 丁香久久综合 | 国产 成人 久久 | 精品一区二区在线观看 | 国产中文字幕av | 天天综合久久综合 | www.久久久久 | 久久久鲁 | 狠狠亚洲 | 91成人在线观看喷潮 | 亚洲精品影院在线观看 | 久久久久夜色 | 国内精品免费久久影院 | 久久精品站 | 99re久久资源最新地址 | www.夜夜骑.com | 欧美日韩精品在线观看视频 | 91手机电视| 久久精品麻豆 | 看国产黄色大片 | 丁香综合 | 国产黑丝袜在线 | 中文字幕亚洲不卡 | 欧美在线视频日韩 | 亚洲精品免费在线 | www.五月天婷婷.com | 一区中文字幕在线观看 | 色综合天天色综合 | 国产系列 在线观看 | 久久视频免费在线 | 91在线看视频 | 欧美日韩国产色综合一二三四 | 亚洲干| 亚洲精品国产电影 | 中文字幕在线国产精品 | 久久久久久久看片 | 99久久精品国 | 在线精品视频在线观看高清 | 国产一区二区综合 | 欧美激情精品久久 | 国产一级在线 | 日韩中文字幕免费在线播放 | 欧美在线视频第一页 | 日本h视频在线观看 | 亚洲国产精品推荐 | 在线一区二区三区 | 欧美91精品国产自产 | 日韩中文字幕第一页 | 国产乱对白刺激视频在线观看女王 | 97韩国电影 | 久久y| 精品九九九 | 久久久亚洲国产精品麻豆综合天堂 | 黄色特级一级片 | 国产一区二区三区免费在线 | 波多野结衣精品在线 | 玖玖爱在线观看 | 一级成人免费视频 | 五月天狠狠操 | 久久久久久亚洲精品 | 草久视频在线 | 精品国产1区 | 久草免费色站 | 狠狠狠的干 | 日韩乱色精品一区二区 | 在线观看播放av | 亚洲五月| 操操色 | 久久久精品久久 | 精品视频久久 | 色视频在线观看免费 | 日韩手机在线观看 | 人人添人人澡人人澡人人人爽 | 国产精品99页 | 美女网站在线看 | 一区在线观看 | 日日操日日 | 久久久久一区二区三区四区 | 91香蕉视频在线 | 国产精品久久久久亚洲影视 | 91av资源网 | 国产 一区二区三区 在线 | 狠狠的干狠狠的操 | 成人a免费| 久久成人国产精品入口 | 亚洲专区免费观看 | 国产精品不卡视频 | 精品xxx| 91精品免费在线 | 久久激情视频网 | 美女视频久久 | 亚洲免费在线播放视频 | av资源在线观看 | www亚洲视频| www.色婷婷| 久久一区国产 | 亚洲精品在线视频观看 | 免费特级黄色片 | 国产一级特黄毛片在线毛片 | 天堂在线免费视频 | 中文字幕在线观看视频网站 | www.国产在线观看 | 亚洲激情在线观看 | 一区二区视频在线播放 | 日本久久91 | 日韩精品久久一区二区三区 | 欧美一区免费在线观看 | 国内精品中文字幕 | 麻豆视频免费在线播放 | 国产69熟| 欧美日韩视频一区二区三区 | 久久成人麻豆午夜电影 | 在线观看av的网站 | 亚洲激情视频在线观看 | 国内一区二区视频 | 91成人免费在线 | 国产一级性生活视频 | 热久久国产精品 | 麻豆成人在线观看 | 四虎视频| www.国产在线观看 | 精品国产免费观看 | 9999在线| 福利视频一区二区 | 天天操天天爽天天干 | av线上免费观看 | 国产一级黄色电影 | 日韩高清免费无专码区 | 中文字幕高清有码 | 日韩视频免费观看高清 | 亚洲国产97在线精品一区 | 特级毛片爽www免费版 | 日日干美女 | 日日噜噜噜噜夜夜爽亚洲精品 | 麻豆视屏 | 天堂网一区二区三区 | 国产免费成人 | 国产盗摄精品一区二区 | 国产69精品久久99的直播节目 | 欧美日韩视频免费看 | 久久精彩免费视频 | 天天操人人干 | 国产成人精品一区二区三区福利 | 免费情缘 | 在线看成人av | 99性视频 | 又色又爽又黄 | 人人爽人人片 | 国产精品一区二区在线免费观看 | 精品亚洲va在线va天堂资源站 | 久久人人爽人人爽人人片av软件 | 成人国产精品电影 | 亚洲mv大片欧洲mv大片免费 | 日本公妇色中文字幕 | 免费观看av | 亚洲精品在线一区二区三区 | 中文字幕黄色网 | 免费中文字幕在线观看 | 欧美成人区 | av网址最新 | 久久大香线蕉app | 欧美午夜久久久 | 日韩和的一区二在线 | 91大神精品视频在线观看 | 国产免码va在线观看免费 | 91精品国产麻豆 | 天天操操操操操 | 中文字幕精品www乱入免费视频 | 亚洲视屏| 久久激情网站 | 日韩精品一区二区免费 | 免费观看版 | 亚洲成人av在线播放 | 国产91精品一区二区绿帽 | 西西人体4444www高清视频 | 在线观看aaa | 亚洲日本中文字幕在线观看 | 久久不射电影院 | 日韩精品欧美一区 | 久久久国产一区 | 日日干 天天干 | 日韩精品高清视频 | 久久精彩| 国产精品成人国产乱 | 国产精品一区二区免费在线观看 | 青青草国产精品 | 亚洲国产成人久久 | 性色av香蕉一区二区 | 国产区在线视频 | 中文字幕一区二区三区久久 | 亚洲精品乱码久久久久久写真 | 亚洲国产一区在线观看 | 欧美成人久久 | 久久伊人爱 | 美女免费视频网站 | 欧美极品裸体 | 在线观看日韩精品视频 | 国产亚洲精品女人久久久久久 | 日韩精品久久久久久久电影竹菊 | 亚洲综合成人专区片 | 中文字幕在线日本 | 色五月成人 | 麻豆网站免费观看 | 91探花在线 | 91高清在线 | 欧美日韩亚洲在线 | japanese黑人亚洲人4k | 国产成人一区二区精品非洲 | 欧美伦理电影一区二区 | 超碰在线公开免费 | 免费看黄在线观看 | 欧美二区三区91 | 91九色视频在线观看 | 丁香六月天婷婷 | 91在线播放国产 |