需求
最近,一个需求的UI是需要展示在ScrollView里面展示许多横向排布的图片,并且,在滑动到第20张的时候,有个View的拉出,提示是否要去查看大图(类似于listView上拉刷新,但是是横向的)。
初步实现
其实,最初的想法,就是使用下面的结构:
去实现,然后调用
horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener();
实现即可,但是后来返现在监听到需要loadMore的时候,发现会出发很多次(因为逻辑是getScrollX()>limited)就会当做已经需要loadMore了。
还是自己实现一下吧
效果图:
实现:
- 使用scroller进行滑动操作;
- 使用VelocityTracker进行惯性滑动;
关键实现:
默认的loadMoreView的添加
考虑到loadMoreView是需要默认实现并添加的,但是何时添加是个问题:
- 如果在控件初始化的时候,就进行初始化,则因为还没有对控件内部的children view进行inflate,并不能添加到整个children的最后一个;
- 如果本来已经
inflate
的layout,之后再代码中动态添加View,如何保证每次添加的view都在loadMoreView的前面,已经非loadMoreView们的最后一个。
所以针对上面两个问题,可以使用下面两段代码解决:
- 在
onFinishInflate()
中添加loadMoreView
@Override
protected void onFinishInflate() {
super.onFinishInflate();
if (canLoadMore) {
View moreView = provideMoreView();
addView(moreView, -1);
}
}
- 覆写
addView()
方法,直接添加到指定的位置
@Override
public void addView(View child) {
addView(child, getChildCount() - 1);
}