• 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);
    }
    }
  • 相关阅读:
    面试题19:包含min函数的栈
    编程之美 计算字符串的相似度
    android 数据持久化——I/O操作
    SSD磁盘,CPU居高不下,高并发的情况下,是不是mysql解析器耗费的cpu资源高?
    Eclipse、MyEclipse优化,提高运行速度
    Sonar入门学习
    Oracle 生成指定范围内随机日期
    ios中的GCD
    如何使用Win8系统自带杀毒软件
    安装Ubuntu版本linux过程中没有提示设置root用户密码问题的解决办法
  • 原文地址:https://www.cnblogs.com/John-Chen/p/6441697.html
Copyright © 2020-2023  润新知