有点问题,通过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. JavaScript------处理Json数据

    //JSON相关函数 JSON.parse(); //将JSON字符串转换为JavaScript对象JSON.stringify(); //将JavaScript值转换为JSON字符串 1.//JSO ...

  2. .NET防止重复提交数据

    最近在做一个销售系统的时候,操作人员提交数据的时候数据库竟然会出现多条数据相同的记录,并且是在1秒之内,客户反馈给我们,第一反应是重复提交的问题,检查了下代码,程序执行完成后应该是跳转到别的页面的,可 ...

  3. UVa 10226 - Hardwood Species

    题目大意:给出n棵树(有重复),统计每种树出现的频率.使用STL的map. #include <cstdio> #include <iostream> #include < ...

  4. Objective-C中的Hello World

    Objective-C在C语言的基础之上,加入了自己的一些独特的特性,而且在Objective-C中兼容C语言原有的用法.在Objective-C中,实现Hello World和C语言有一定的区别,如 ...

  5. WGCNA算法研究笔记

    转自:http://www.gogoqq.com/ASPX/8390905/JournalContent/1303140588.aspx 研究了近半年的算法,记录下来给自己一个交代,也应该是考G前地最 ...

  6. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...

  7. 判断activity是否显示在界面上

    boolean result = false; ActivityManager am = (ActivityManager) context .getSystemService(Context.ACT ...

  8. delphi 获得memo,Richedit焦点所在行

    procedure TForm1.Button1Click(Sender: TObject); var i:Integer; begin i:=SendMessage(Richedit1.handle ...

  9. oracle11g手工建库

    1.设置环境变量 [oracle@HE3~]$ vi .bash_profile exportPATH exportEDITOR=vi exportORACLE_SID=orcl exportORAC ...

  10. JAVA中获取当前运行的类名,方法名,行数

    JAVA中获取当前运行的类名,方法名,行数 public static String getTraceInfo(){ StringBuffer sb = new StringBuffer(); Sta ...