异步加载图片实例刷新闪屏的问题

akebrt 2016-08-24 06:55:15
http://www.iteye.com/topic/1118828
这个异步加载图片可以让GridView在滚动的时候停止加载,滚动停止了再开始加载屏幕所见的Item。

参照这位仁兄的实例写个异步加载图库的项目,我要给他加个实体按键操作选项框的功能,用上下左右按键控制图片选项框来选择图片。

这段代码每传一个值都会notifyDataSetChanged刷新一下,然而上面的实例每刷新一下又要重新加载,由于默认图片和加载图片的切换就会造成闪屏的现象。然后我给他加了个判定

但是这样刷新的时候 还是能看到屏幕下边沿和上边沿有闪屏。

我想问下大神这样的问题怎样解决?或者怎样更好的方法能让按键的时候不会闪屏?
...全文
841 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
akebrt 2016-08-29
  • 打赏
  • 举报
回复
多谢各位,我用ImageLoader库问题解决了。
davl 2016-08-26
  • 打赏
  • 举报
回复
imageLoad有个加载失败设置默认图片的方法,你试试看
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 2 楼 akebrt 的回复:
[quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 9 楼 akebrt 的回复:
[quote=引用 7 楼 a784063999 的回复:] [quote=引用 6 楼 akebrt 的回复:] [quote=引用 5 楼 a784063999 的回复:] [quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了[/quote]加個數組根據索引儲存已經加載的圖片, 在滑動結束時把不在範圍的設置為null, 然後判斷在範圍裏的是否為null, 是就加載, getView裏加個判斷, 如果數組相應位置的不為null, 就用那圖[/quote] 这样听起来好像是可以的 但是我不知道该怎么做~ 我还是个新手[/quote]哪步不會?
davl 2016-08-25
  • 打赏
  • 举报
回复
可以去学学imageLoader机制
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 8 楼 yangchengtest 的回复:
setBackgroundResource是立即执行的。 加载网络图片是其他线程异步加载的。 最好不要用setBackgroundResource加载默认图。 用异步加载图片的方法加载默认图,这样加载图片的顺序就不会出现异常。(开源的一般用单例多线程的方式加载,这样顺序一般不会错,也就不会闪屏)。
还是不知道该怎么做 不知道默认图加在哪合适
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 7 楼 a784063999 的回复:
[quote=引用 6 楼 akebrt 的回复:] [quote=引用 5 楼 a784063999 的回复:] [quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了[/quote]加個數組根據索引儲存已經加載的圖片, 在滑動結束時把不在範圍的設置為null, 然後判斷在範圍裏的是否為null, 是就加載, getView裏加個判斷, 如果數組相應位置的不為null, 就用那圖[/quote] 这样听起来好像是可以的 但是我不知道该怎么做~ 我还是个新手
magicyang1234 2016-08-25
  • 打赏
  • 举报
回复
setBackgroundResource是立即执行的。 加载网络图片是其他线程异步加载的。 最好不要用setBackgroundResource加载默认图。 用异步加载图片的方法加载默认图,这样加载图片的顺序就不会出现异常。(开源的一般用单例多线程的方式加载,这样顺序一般不会错,也就不会闪屏)。
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 6 楼 akebrt 的回复:
[quote=引用 5 楼 a784063999 的回复:] [quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了[/quote]加個數組根據索引儲存已經加載的圖片, 在滑動結束時把不在範圍的設置為null, 然後判斷在範圍裏的是否為null, 是就加載, getView裏加個判斷, 如果數組相應位置的不為null, 就用那圖
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 5 楼 a784063999 的回复:
[quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 4 楼 akebrt 的回复:
[quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 3 楼 a784063999 的回复:
[quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 12 楼 a784063999 的回复:
[quote=引用 9 楼 akebrt 的回复:] [quote=引用 7 楼 a784063999 的回复:] [quote=引用 6 楼 akebrt 的回复:] [quote=引用 5 楼 a784063999 的回复:] [quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了[/quote]加個數組根據索引儲存已經加載的圖片, 在滑動結束時把不在範圍的設置為null, 然後判斷在範圍裏的是否為null, 是就加載, getView裏加個判斷, 如果數組相應位置的不為null, 就用那圖[/quote] 这样听起来好像是可以的 但是我不知道该怎么做~ 我还是个新手[/quote]哪步不會?[/quote]算我還是說一下, ArrayList是能動態變長的數組這個很常用, 你自己去網上學, 滑動結束你參考那個不是有設置滑動的監聽嗎, 有一個是滑動結束的, 判斷可見的物品範圍你參考的也有
a784063999 2016-08-25
  • 打赏
  • 举报
回复
引用 14 楼 akebrt 的回复:
我这个问题就是因为 这个设置默认图片在getView里面,而且前面没有任何条件限制它。每次notifyDataSetChanged刷新时都会先执行它,把图片恢复默认然后再加载显示出来造成闪屏。 如果可以在这句话前面加个判定让他需要什么条件才执行,或者把它放在别的地方可以让显示的图片能正常加载,没显示的图片执行这句话,问题就可以解决了。 ~~~~~~有没有大神有什么好方法??? 希望能说个简单点或者容易懂的,我是个新手
簡單點的方法是利用ListView的分類, 分已加載的和未加載的, Adapter裏重載getItemViewType(int position)返回相應類型, 重載getViewTypeCount()返回你的種類, 已加載的+未加載=2, 返回2就可, 然後在getView裏用根據類型實現不同的背景(如果是未加載的只需在創建View對象時設置), 我可以把實現代碼打出來, 但這樣我覺得你就學不會自己想代碼
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 11 楼 csd123n123 的回复:
可以去学学imageLoader机制
这个跟我的问题是一样的 还是要找个合适的地方把设置默认图片的代码放上去就可以解决了
akebrt 2016-08-25
  • 打赏
  • 举报
回复
我这个问题就是因为

这个设置默认图片在getView里面,而且前面没有任何条件限制它。每次notifyDataSetChanged刷新时都会先执行它,把图片恢复默认然后再加载显示出来造成闪屏。

如果可以在这句话前面加个判定让他需要什么条件才执行,或者把它放在别的地方可以让显示的图片能正常加载,没显示的图片执行这句话,问题就可以解决了。

~~~~~~有没有大神有什么好方法???
希望能说个简单点或者容易懂的,我是个新手
akebrt 2016-08-25
  • 打赏
  • 举报
回复
引用 12 楼 a784063999 的回复:
[quote=引用 9 楼 akebrt 的回复:] [quote=引用 7 楼 a784063999 的回复:] [quote=引用 6 楼 akebrt 的回复:] [quote=引用 5 楼 a784063999 的回复:] [quote=引用 4 楼 akebrt 的回复:] [quote=引用 3 楼 a784063999 的回复:] [quote=引用 2 楼 akebrt 的回复:] [quote=引用 1 楼 yangchengtest 的回复:] viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例[/quote] 那方法感覺不好, 直接在滑動完畢時開一個線程加載並改那些看到的view的圖不是更好?[/quote] 这个好像是这样的,滑动的时候停止加载,滑动结束再开始加载[/quote] 滑動結束時, 你開個線程獲取顯示了物品的範圍, 然後加載相應圖片, 再根據索引用findViewWithTag獲取相應view, 然後設置它的圖片, 應該不用調用notifyDataSetChanged吧[/quote] 调用notifyDataSetChanged是我按键之后要刷新一下,刷新之后他会把已经显示的图片再重新加载一次:显示图片-默认图片-显示图片,这样就闪屏了[/quote]加個數組根據索引儲存已經加載的圖片, 在滑動結束時把不在範圍的設置為null, 然後判斷在範圍裏的是否為null, 是就加載, getView裏加個判斷, 如果數組相應位置的不為null, 就用那圖[/quote] 这样听起来好像是可以的 但是我不知道该怎么做~ 我还是个新手[/quote]哪步不會?[/quote] 知识有限 试了半天都不行,好像一步都不会了
akebrt 2016-08-24
  • 打赏
  • 举报
回复
引用 1 楼 yangchengtest 的回复:
viewHolder
用了这个加异步可以流畅的加载少量的图片,但是我用SD卡装100多张的时候,滑动会卡,滑快了还会死。所以就找了上面的实例
magicyang1234 2016-08-24
  • 打赏
  • 举报
回复
viewHolder

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧