在 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(){
- removeCallbacks(checkScrollIdle);
- postDelayed(checkScrollIdle, 1000);
- }
来源: http://www.cnblogs.com/John-Chen/p/6441697.html