實現列表懸浮標簽“頂上去”的效果

auoo7681 8年前發布 | 5K 次閱讀 Android開發 移動開發 RecyclerView

列表頂部的標簽懸浮大家應該都知道,但“頂上去”是個啥玩意?

看一下效果圖就知道了,注意看頂部的懸浮標簽切換時的效果:

這是我在之前一個自定義側邊索引欄的項目上修改的,對側邊索引欄的實現有興趣的可以看一下之前的文章:自定義側邊快速索引欄

思路是這樣子的:

  • 布局里面增加一個和索引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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!