需求
最近,一個需求的UI是需要展示在ScrollView里面展示許多橫向排布的圖片,并且,在滑動到第20張的時候,有個View的拉出,提示是否要去查看大圖(類似于listView上拉刷新,但是是橫向的)。
初步實現(xiàn)
其實,最初的想法,就是使用下面的結(jié)構(gòu):
<HorizontalScrollView>
<LinearLayout>
</LinearLayout>
</HorizontalScrollView>
去實現(xiàn),然后調(diào)用
horizontalScrollView.getViewTreeObserver().addOnScrollChangedListener();
實現(xiàn)即可,但是后來返現(xiàn)在監(jiān)聽到需要loadMore的時候,發(fā)現(xiàn)會出發(fā)很多次(因為邏輯是getScrollX()>limited)就會當(dāng)做已經(jīng)需要loadMore了。
還是自己實現(xiàn)一下吧
效果圖:

horizontalScrollView
實現(xiàn):
- 使用scroller進(jìn)行滑動操作;
- 使用VelocityTracker進(jìn)行慣性滑動;
關(guān)鍵實現(xiàn):
默認(rèn)的loadMoreView的添加
考慮到loadMoreView是需要默認(rèn)實現(xiàn)并添加的,但是何時添加是個問題:
- 如果在控件初始化的時候,就進(jìn)行初始化,則因為還沒有對控件內(nèi)部的children view進(jìn)行inflate,并不能添加到整個children的最后一個;
- 如果本來已經(jīng)
inflate的layout,之后再代碼中動態(tài)添加View,如何保證每次添加的view都在loadMoreView的前面,已經(jīng)非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);
}