有点问题,通过ItemView不一定能追溯到ListView,parent.getParent()可能是null,后面再想下解决方式......

在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列表停止滚动,加载图片,较为通用的一种办法的更多相关文章

  1. Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...

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

    折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...

  3. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  4. Android中的Glide加载图片

    注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...

  5. 潭州课堂25班:Ph201805201 django 项目 第二十二课 文章主页 新闻列表页面滚动加载,轮播图后台实现 (课堂笔记)

    新建static/js/news/index.js文件 ,主要用于向后台发送请求, // 新建static/js/news/index.js文件 $(function () { // 新闻列表功能 l ...

  6. Android 实现ListView异步加载图片

    ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...

  7. 滚动加载图片(懒加载)实现原理(这是旧实现,仅做为获取元素宽高api的参考)

    https://www.cnblogs.com/flyromance/p/5042187.html 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载 ...

  8. javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】

    先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...

  9. 使用infinite-scroll实现Ghost博文列表的滚动加载

    Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...

随机推荐

  1. Tessnet2图片识别(2)

    1. 引用 tessnet2.dll (只有NET2.0版本) 2. 视图页 <%@ Page Language="C#" MasterPageFile="~/Vi ...

  2. js动画学习笔记

    <html> <head> <meta charest="utf-8"> <title>test</title> < ...

  3. iOS 之 微信开发流程

    第1阶段 注册开放平台帐号 注册成为微信开放平台开发者 立即注册 认证开发者资质 开发者资质认证通过后才可申请微信支付,申请审核服务费:300元/次 立即认证 创建APP并提交审核 提交你的APP基本 ...

  4. ios 清除列表选中状态

    [tableView deselectRowAtIndexPath:indexPath animated:YES];

  5. $(function(){})和$(document).ready(function(){}) 的区别

    document.ready和onload的区别——JavaScript文档加载完成事件 页面加载完成有两种事件 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二是onloa ...

  6. 让表格table呈现边框,不用给tr、td加边框的写法

    <table width="100%" cellspacing="1" cellpadding="1" bgcolor="# ...

  7. DELPHI中多线程知识【转】

    本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...

  8. servlet中的8个Listener

    servlet中的8个Listener: Xml: <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  9. Canvas get/putImageData

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. java中数组的排序,直接排序,冒泡排序,插入排序

    1.直接排序: public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for ...