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博客系统默认提供的博文列表为传统的翻页方式(通过点击上一页.下一页等按钮来切换),随着移动客户端的发展,瀑布流式的滚动加载方式得到广泛应用,有效地提高了用户浏览信息的流畅度.下面详述如何通过 ...
随机推荐
- Tessnet2图片识别(2)
1. 引用 tessnet2.dll (只有NET2.0版本) 2. 视图页 <%@ Page Language="C#" MasterPageFile="~/Vi ...
- js动画学习笔记
<html> <head> <meta charest="utf-8"> <title>test</title> < ...
- iOS 之 微信开发流程
第1阶段 注册开放平台帐号 注册成为微信开放平台开发者 立即注册 认证开发者资质 开发者资质认证通过后才可申请微信支付,申请审核服务费:300元/次 立即认证 创建APP并提交审核 提交你的APP基本 ...
- ios 清除列表选中状态
[tableView deselectRowAtIndexPath:indexPath animated:YES];
- $(function(){})和$(document).ready(function(){}) 的区别
document.ready和onload的区别——JavaScript文档加载完成事件 页面加载完成有两种事件 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二是onloa ...
- 让表格table呈现边框,不用给tr、td加边框的写法
<table width="100%" cellspacing="1" cellpadding="1" bgcolor="# ...
- DELPHI中多线程知识【转】
本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅.所有代码均亲自测试 delphi7下测试有效.图片均为自己制作. 多线程应该是编程工作者的基础技能, 但这个基础我从来没学过,所以 ...
- servlet中的8个Listener
servlet中的8个Listener: Xml: <?xml version="1.0" encoding="UTF-8"?> <web-a ...
- Canvas get/putImageData
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- java中数组的排序,直接排序,冒泡排序,插入排序
1.直接排序: public static void selectSort(int[] arr) { for (int x = 0; x < arr.length - 1; x++) { for ...