android列表停止滚动,加载图片,较为通用的一种办法
有点问题,通过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列表停止滚动,加载图片,较为通用的一种办法的更多相关文章
- Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法
Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...
- Android之ListView异步加载图片且仅显示可见子项中的图片
折腾了好多天,遇到 N 多让人崩溃无语的问题,不过今天终于有些收获了,这是实验的第一版,有些混乱,下一步进行改造细分,先把代码记录在这儿吧. 网上查了很多资料,发现都千篇一律,抄来抄去,很多细节和完整 ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- Android中的Glide加载图片
注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...
- 潭州课堂25班:Ph201805201 django 项目 第二十二课 文章主页 新闻列表页面滚动加载,轮播图后台实现 (课堂笔记)
新建static/js/news/index.js文件 ,主要用于向后台发送请求, // 新建static/js/news/index.js文件 $(function () { // 新闻列表功能 l ...
- Android 实现ListView异步加载图片
ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; ...
- 滚动加载图片(懒加载)实现原理(这是旧实现,仅做为获取元素宽高api的参考)
https://www.cnblogs.com/flyromance/p/5042187.html 本文主要通过以下几方面来说明懒加载技术的原理,个人前端小菜,有错误请多多指出 一.什么是图片滚动加载 ...
- javacript 实现瀑布流原理和效果, 滚动加载图片【图文解析 附源码】
先科普下瀑布流吧 瀑布流,又称瀑布流式布局.是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部.最早采用此布局的网站是Pin ...
- 使用infinite-scroll实现Ghost博文列表的滚动加载
Ghost博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...
随机推荐
- 学习tabhost 实现微博的主界面
2014-05-27 吴文付 微博的主界面还是很漂亮的,我们这里来熟悉下tabhost的使用, 网上资料很多,主要参考了:http://blog.csdn.net/shulianghan/articl ...
- Linux - tomcat -jndi数据源配置
Linux - tomcat -jndi数据源配置 tomcat/conf/context .xml 文件中修改如下 <Resource name="/jdbc/--" au ...
- UVa 11790 - Murcia's Skyline
题目大意:给一个建筑的序列,建筑用高度和宽度描述,找出按高度的LIS和LDS,最长XX子序列的长度按照序列中建筑的宽度和进行计算. 其实就是带权的最长XX子序列问题,原来是按个数计算,每个数权都是1, ...
- osgearth介绍(转载)-feature_labels.earth
初识osg OSG的诞生 在 1997 年时,Don Burns 由于喜欢滑翔机运动且对计算机图形学非常熟悉,在 LINUX 上写了一个控制滑翔机的小引擎,这便是 OSG 的最初雏形.后来在 1998 ...
- Bmob 之 简单使用
1. pod pod 'BmobSDK' 与 pod "BmobSDK" 好像没什么区别 2. 导入 在AppDelegate中: #import <BmobSDK/Bmob ...
- I帧/P帧/B帧---术语解释
视频压缩中,每帧代表一幅静止的图像.而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的. 简单地说,I帧是关键帧,属于帧内压缩.就是和AVI的压缩是一样的. P是向前搜索的意思.B ...
- 关于GCD同步组实现多个异步线程的同步执行中的注意点
在App开发中经常会遇到多个线程同时向服务器取数据, 如果每个线程取得数据后都去刷新UI会造成界面的闪烁 也有可能出现部分数据还没有获取完毕造成程序crash 之前在网上看到很多是利用dispatch ...
- 005.数组、for、foreach
1.方法的传输传递 值参数:传递的是副本 引用参数:自身 保留自定义的方法中对值的改变 形参影响实参ref:对应的形参和实参都用ref修饰 输出参数:实参不用赋值,但是自定义方法内必须对此参数赋值!! ...
- Nancy简单实战之NancyMusicStore(六):写在最后
前言 由于公司搬家后,住的地方离上班的地方远了N倍,以前是走路十多分钟就可以到公司的,上班时间也从9:00提早到8:30 现在每天上班都是先坐公交,然后再坐地铁,在这段路上比较浪费时间而且每天都是要6 ...
- Web前端常用快捷键总结(OS X系统)
OS X系统截图:command + shift + 4 强制关闭OS X系统内无响应的程序:command + option +ESC Sublime Text 3: 显示或隐藏Side Bar:c ...