實現列表懸浮標簽“頂上去”的效果
列表頂部的標簽懸浮大家應該都知道,但“頂上去”是個啥玩意?
看一下效果圖就知道了,注意看頂部的懸浮標簽切換時的效果:
這是我在之前一個自定義側邊索引欄的項目上修改的,對側邊索引欄的實現有興趣的可以看一下之前的文章:自定義側邊快速索引欄
思路是這樣子的:
- 布局里面增加一個和索引item長的一樣的view,默認顯示列表第一項的索引字母。
- 監聽列表的滑動,當列表可見的第二項是索引item時,計算并更新懸浮view的Y坐標,讓它處于索引item的上方。
- 監聽列表的滑動,當列表可見第一項發生變化時,更新懸浮view顯示的字母為當前可見第一項的索引字母。
感覺比想象中簡單啊。可以看出邏輯都是在滑動事件里,我們用RecyclerView的addOnScrollListener方法監聽列表的滑動事件,在監聽器里面實現上面的邏輯。說的可能不是很好,看代碼就知道多簡單了。
監聽器的代碼如下:
class mScrollListener extends RecyclerView.OnScrollListener {
private int mFlowHeight;
private int mCurrentPosition = -1;
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
mFlowHeight = vFlow.getMeasuredHeight();
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition();
View view = layoutManager.findViewByPosition(firstVisibleItemPosition + 1);
if (view != null) {
if (view.getTop() <= mFlowHeight && isItem(firstVisibleItemPosition + 1)) {
vFlow.setY(view.getTop() - mFlowHeight);
} else {
vFlow.setY(0);
}
}
if (mCurrentPosition != firstVisibleItemPosition) {
mCurrentPosition = firstVisibleItemPosition;
tvFlowIndex.setText(mList.get(mCurrentPosition).getFirstWord());
}
}
/**
* @param position 對應項的下標
* @return 是否為標簽項
*/
private boolean isItem(int position) {
return mAdapter.getItemViewType(position) == MainAdapter.VIEW_INDEX;
}
}
這樣就已經實現“頂上去的效果了”,妥妥的。
最后說明一下,這個代碼是使用RecyclerView實現的,要是用ListView的話是有問題的。ListView的item使用getTop()方法,剛開始拿到的應該是item距離整個ListView最頂部的距離,要都是這樣還好處理,但是復用item的時候這個值又發生了變化。
來自:http://www.jianshu.com/p/67634a170333
本文由用戶 auoo7681 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!