android列表停止滚动,加载图片,较为通用的一种办法
2017-02-25 14:11
423 查看
有点问题,通过ItemView不一定能追溯到ListView,parent.getParent()可能是null,后面再想下解决方式......
在Adapter的itemView里面,判断列表是否在滚动中,其实是比较麻烦的,可能耦合性会比较严重。
所以考虑了下,是否能在itemView里面,检测列表的滚动状态,并监听停止状态加载图片,实现itemView与Adapter进而与ListView等解耦呢?
想到了一种实现方法,直接上代码了:
使用:
加载图片前:
在Adapter的itemView里面,判断列表是否在滚动中,其实是比较麻烦的,可能耦合性会比较严重。
所以考虑了下,是否能在itemView里面,检测列表的滚动状态,并监听停止状态加载图片,实现itemView与Adapter进而与ListView等解耦呢?
想到了一种实现方法,直接上代码了:
/** * 判断某一个view所属的父控件(ListView、ViewPager等),是否在滚动中 * @param view 需要判断的界面 * @return 是否还在滚动中 */ public static boolean isParentScrolling(View view){ ViewParent parent = view.getParent(); while (parent != null) { if (parent instanceof AbsListView) { //private int mLastScrollState = OnScrollListener.SCROLL_STATE_IDLE; int state = getAbsListViewScrollState((AbsListView)parent); return state != AbsListView.OnScrollListener.SCROLL_STATE_IDLE; } if (parent instanceof RecyclerView) { //private int mScrollState = SCROLL_STATE_IDLE; int state = getRecyclerViewScrollState((RecyclerView)parent); return state != RecyclerView.SCROLL_STATE_IDLE; } //......其他类型 parent = parent.getParent(); } return false; } /** * 通过反射获取AbsListView的滚动状态 */ public static int getAbsListViewScrollState(AbsListView listView){ //private int mLastScrollState = OnScrollListener.SCROLL_STATE_IDLE; try { Field f = AbsListView.class.getDeclaredField("mLastScrollState"); f.setAccessible(true); return f.getInt(listView); } catch (Exception e) { e.printStackTrace(); } return AbsListView.OnScrollListener.SCROLL_STATE_IDLE; } /** * 通过反射获取AbsListView的滚动状态 */ public static int getRecyclerViewScrollState(RecyclerView listView){ //private int mScrollState = SCROLL_STATE_IDLE; try { Field f = AbsListView.class.getDeclaredField("mScrollState"); f.setAccessible(true); return f.getInt(listView); } catch (Exception e) { e.printStackTrace(); } return RecyclerView.SCROLL_STATE_IDLE; }
使用:
加载图片前:
boolean isScrolling = ViewUtil.isParentScrolling(this); if(isScrolling){ // 测试,正常情况下,如果滚动停止,不会调用onDraw方法进而加载图片刷新 // 所以我们得自己加延时检测是否停止了 waitScrollStop(); return; } 相关方法,不同的情况使用可能不一样:
/** * 在加载图片,检测到正在滚动时调用 */ private Runnable checkScrollIdle = new Runnable() { @Override public void run() { boolean isScrolling = ViewUtil.isParentScrolling(DrawView.this); if(!isScrolling){ //停止时刻,重新加载图片 //通过刷新重新绘制的方法,会重新检测图片是否加载 postInvalidate(); }else{ //没有停止,继续检测 waitScrollStop(); } } }; /** * 检测到滚动时调用,然后一直通过handler检测停止状态 */
private void waitScrollStop(){ if(isAttachedToWindow()){ //保证没有被移除 removeCallbacks(checkScrollIdle); postDelayed(checkScrollIdle, 1000); } }
相关文章推荐
- 【Android】Glide结合Recyclerview(也适用于Listview)实现列表滑动的时候图片不加载,滑动停止的时候加载(已修正Listview部分以及排版)
- android listview 滚动时异步加载图片的问题
- android加载大量图片内存溢出bitmap size exceeds VM budget的解决办法。
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android Listview 加载图片优化--本地加载大量图片,解决滑动卡顿现象(滑动停止加载图片)
- Android WebView不加载图片资源的解决办法
- ListView 滚动翻页/滚动加载(类似Android Market的列表)
- Android UI开发第三十六篇——使用Volley加载图片列表
- Android 图片加载Bitmap OOM错误解决办法
- Android实现异步从网络加载图片列表 .
- android listview 滚动时异步加载图片的问题
- android Gallery实现异步加载网络图片 并只加载当前停止页面图
- Android实现异步从网络加载图片列表
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- ListView 滚动翻页/滚动加载(类似Android Market的列表)
- android listview 滚动时异步加载图片的问题
- Android之ListView优化(使用Lrucache,图片滑动时使用默认图片,停止时加载)
- Android_开发 Gallery实现异步加载网络图片 并只加载当前停止页面图
- Android UI开发第三十六篇——使用Volley加载图片列表
- 从后台返回游戏的时候,新增弹出窗口的图片在android不加载(纹理变黑)的解决办法