有点问题,通过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. Linux内核探索之路——关于方法

    转载自:http://blog.chinaunix.net/uid-20608849-id-3014502.html   Linux内核实践之路 -给那些想从Linux内核找点乐趣的人 一个不能回避的 ...

  2. [转]centos 6.5安装caffe

    centos 6.5安装caffe 原文地址:http://blog.csdn.net/wqzghost/article/details/47447377   总结:在安装protobuf,hdf5等 ...

  3. php __set()和__get()函数

    <?php /* 总结: 1. 从一个难以访问的属性读取数据的时候 __get() 方法被调用 2. 向一个难以访问的属性赋值的时候 __set() 方法被调用 3. 难以访问包括:(1)私有属 ...

  4. Python模块学习:threading 多线程控制和处理

    Reference:http://python.jobbole.com/81546/ threading.Thread Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有 ...

  5. YII 1.0模型标签与验证规则,前后台验证

    model Admin.php model(),tabName()是固定格式 <?php /* 管理员模型 * ----------------------------------------- ...

  6. 如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

    当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_ ...

  7. html标签默认样式整理

    引:http://www.jb51.net/web/94964.html 文为大家整理了html标签默认样式属性及浏览器默认样式等等,喜欢css布局的朋友们可以学下,希望对大家有所帮助 html, a ...

  8. Everything开机自启

    第一步:关闭自动启动 在设置中关闭everything开机自动启动. 第二步:创建计划任务 点击“开始”—“任务计划程序”—“创建任务” 首先设置任务的名称等,注意一定要勾选“使用最高权限运行”. 然 ...

  9. PKU-1704-Georgia and Bob

    题目链接 http://poj.org/problem?id=1704 这个题目是个好题,没有两下子是做不出的,其中考到,要你排序,如何把题目化成我们熟知的东西, 在这个题中我开始用选择法排序,他给我 ...

  10. js url参数的获取和设置以及删除

    //获取url参数的值:name是参数名 function getQueryString(name) { var reg = new RegExp("(^|&)" + na ...