ZAdapter3 断头吸附效果

Android · luhaoaimama1 · Created at · Last by xw233678 Replied at · 1981 hits
2919 1486395760

本文在 DiyCodeZone的个人博客 首发,关注作者的 DiyCode帐号 或者作者微博可第一时间收到新文章推送。

几种方案是选择

  • 外层一个显示的断头和内部的布局一样,但不是同一个 因为涉及到选择状态和 横向滚动 而导致的复杂性 放弃!

  • 自定义recyclerView布局,这样解决了是同一个的view的问题。但是因为getTop而导致 刷新监听的不兼容 放弃!

  • 既然想要用同一个View的话可以用李代桃僵的方式去实现,既用一个空view去代替RecyclerView的Itemview站位。然后吧itemView显示在断头上即可!

效果图

demo

public class AdsorbActivity extends Activity {

    private List<String> mDatas = new ArrayList<String>();
    private RecyclerView rv;
    private IAdapter<String> muliAdapter;
    private FrameLayout vp;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a_recycler_absorb);
        rv = (RecyclerView) findViewById(R.id.rv);
        vp = (FrameLayout) findViewById(R.id.vp);
        rv.setLayoutManager(new LinearLayoutManager(this));
        for (int i = 1; i <= 100; i++) {
            mDatas.add("" + i);
        }
        rv.addOnScrollListener(new AbsorbOnScrollListener(vp, 3, 6, 9));

        muliAdapter = new QuickRcvAdapter(this, mDatas) {
            @Override
            protected int getItemViewType2(int dataPosition) {
                if (dataPosition == 3)
                    return 1;
                else if (dataPosition == 6)
                    return 2;
                else if (dataPosition == 9)
                    return 3;
                else
                    return 0;
            }
        };
        muliAdapter
                .addViewHolder(new LeftDelegates())//默认
                .addViewHolder(0, new LeftDelegates()) //多部剧 注释开启即可
                .addViewHolder(1, new AbsorbDelegates())//多部剧 注释开启即可
                .addViewHolder(2, new AbsorbDelegates2())//多部剧 注释开启即可
                .addViewHolder(3, new AbsorbDelegates())//多部剧 注释开启即可
//                .addHeaderHolder(R.layout.header_simple)
//                .addFooterHolder(R.layout.footer_simple)
                .addEmptyHold(R.layout.empty)
                .relatedList(rv)
                .addItemDecoration(70)
                .setOnItemClickListener(new IAdapter.OnItemClickListener() {
                    @Override
                    public void onItemClick(ViewGroup parent, View view, int position) {
                        System.out.println("被点击->onItemClick" + position);
                    }
                })
                .setOnItemLongClickListener(new IAdapter.OnItemLongClickListener() {
                    @Override
                    public boolean onItemLongClick(ViewGroup parent, View view, int position) {
                        System.out.println("被点击->onItemLongClick:" + position);
                        return true;
                    }
                });
    }
}

代码实现


public class AbsorbOnScrollListener extends RecyclerView.OnScrollListener {

    private final FrameLayout vpShow;
    private int[] absorbPos;
    private View[] absorbViews;
    private FrameLayout[] itemViews;
    private View placeholderView;
    private View contentView;

    public AbsorbOnScrollListener(FrameLayout vpShow, int... absorbPos) {
        if (absorbPos == null || absorbPos.length == 0)
            throw new IllegalStateException("absorbPos is not null or empty");
        this.absorbPos = absorbPos;
        this.vpShow = vpShow;
        absorbViews = new View[absorbPos.length];
        itemViews = new FrameLayout[absorbPos.length];
    }

    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        int pos = 0;
        try {
            //GridLayoutManager 继承LinearLayoutManager 所以也支持GridLayoutManager
            pos = ((LinearLayoutManager) (recyclerView.getLayoutManager())).findFirstVisibleItemPosition();
        } catch (Exception e) {
            e.printStackTrace();
            throw new IllegalStateException("仅仅支持继承LinearLayoutManager的布局!");
        }

        //缓存list中断头view
        for (int i = 0; i < absorbPos.length; i++) {
            if (pos == absorbPos[i] && itemViews[i] == null) {
                try {
                    itemViews[i] = (FrameLayout) recyclerView.findViewHolderForLayoutPosition(pos).itemView;
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new IllegalStateException("断头的itemView必须是FrameLayout!");
                }
                absorbViews[i] = itemViews[i].getChildAt(0);
            }
        }
        int showPos = findShowPos(pos);

        if (showPos == -1) {//啥也不显示
            if (placeholderView != null && placeholderView.getParent() != null) {
                restoreItemView(0);
                contentView = null;
            }
        } else {
            if (placeholderView == null)
                placeholderView = new View(recyclerView.getContext());

            //找到对应的位置
            int arrayPos = 0;
            for (int i = 0; i < absorbPos.length; i++) {
                if (showPos == absorbPos[i]) {
                    arrayPos = i;
                    break;
                }
            }

            if (!(contentView != null && contentView == absorbViews[arrayPos])) {
                //如果断头view不改变的话仅仅更改位置  主要是节省了操作

                //找到之前那个itemView 还原了
                for (int i = 0; i < absorbViews.length; i++) {
                    if (absorbViews[i] != null && absorbViews[i] == contentView) {
                        restoreItemView(i);
                        break;
                    }
                }

                //ItemView的狸猫换太子 显示在VP中
                itemViews[arrayPos].removeView(absorbViews[arrayPos]);
                placeholderView.setLayoutParams(absorbViews[arrayPos].getLayoutParams());
                placeholderView.getLayoutParams().height = absorbViews[arrayPos].getHeight();
                itemViews[arrayPos].addView(placeholderView);
                addContentView(absorbViews[arrayPos]);
            }

            //位移计算!
            if (showPos != absorbPos[absorbPos.length - 1]) {//最后的那个不进行位移
                int next = absorbPos[arrayPos + 1];
                if (recyclerView.findViewHolderForLayoutPosition(next) == null)
                    absorbViews[arrayPos].setTranslationY(0);
                else {
                    View targetView = recyclerView.findViewHolderForLayoutPosition(next).itemView;
                    if (targetView.getTop() <= absorbViews[arrayPos].getHeight())
                        absorbViews[arrayPos].setTranslationY(targetView.getTop() - absorbViews[arrayPos].getHeight());
                }
            }


        }
    }

    private void restoreItemView(int i) {
        itemViews[i].removeView(placeholderView);
        vpShow.removeView(absorbViews[i]);
        absorbViews[i].setTranslationY(0);
        itemViews[i].addView(absorbViews[i]);
    }

    private void addContentView(View absorbView) {
        vpShow.addView(absorbView);
        contentView = absorbView;
    }

    // 3,6,9为例  [1,3)show 无 ,[3,6)show 3,[6,9)show 6,>=9 show 9,
    private int findShowPos(int pos) {
        for (int i = 0; i < absorbPos.length; i++) {
            if (pos < absorbPos[i]) {
                if (i == 0)//[1,3)show 无
                    return -1;
                //[3,6)show 3,[6,9)show 6
                System.out.println("Absorb_ i:" + i + "\t itemViews[i-1].getTop()" + itemViews[i - 1].getTop());
                return findWithOutDecTop(i, "Absorb_显示:" + (i - 1), "Absorb_显示:无", "Absorb_显示:" + (i - 2));
            }
        }
        // >=9 show 9
        return findWithOutDecTop(absorbPos.length, "Absorb_显示  Last:" + (absorbPos.length - 1), "Absorb_显示  Last:无", "Absorb_显示  Last:" + (absorbPos.length - 2));
    }

    private int findWithOutDecTop(int i, String x, String x2, String x3) {
        // getTop如果<=0的时候 才显示这个位置的断头
        if (itemViews[i - 1].getTop() <= 0) {//注意:getTop不包括 dector
            QuickConfig.i(x);
            return absorbPos[i - 1];
        } else {//不然还是显示上一个位置的断头
            if (i - 2 < 0) {//上一个位置是无的情况
                QuickConfig.i(x2);
                return -1;
            }
            QuickConfig.i(x3);
            return absorbPos[i - 2];
        }
    }

}

ZAdapter3 github地址 欢迎star~

https://github.com/luhaoaimama1/ZAdapter3

顺便推荐一首歌曲~

https://www.bilibili.com/video/av7043321/

共收到 5 条回复
1366 1527059753

1111

96
mm685265 · #2 ·

臺灣找小姐+賴:211861 大奶大粉嫩可看照.洗澡愛愛按摩口交全套服務
好吃的東西當然要一起分享~ 小弟昨天趁休假找茶姊約了個正妹 果然幫我安排的素質很讚 妹妹叫童童 目前還是個大學生 22歲 身材臉蛋都是我的菜 身高160 甜美可愛 美腿哦 罩杯Dcup 真材實料 吸起來彈性十足 妹妹雖然年紀小 但是性欲很強 喜歡在床上纏著我的腰扭屁股 真的是視覺上肉體上的100分滿足!!全程真的很主動 很會挑逗 皮膚也很棒很白嫩 全身鮑魚都可以隨意摸哦 全身都很敏感 妹妹也很緊 還會夾我的小弟 插起來水水很多 很有感覺 超級讚!!! 真的是個很淫蕩的小女生 讓你有回味無窮的感覺 喜歡的可以嘗試看看 加賴:211861 找童童可看照片 她家還要其他的姊妹 類型很多 加賴說是阿傑介紹 有好康喔!!!

96
ll211861 · #3 ·

@.全套服務(特別服務可喬)
@.看照約妹~自己看到妹妹滿意現金消費維護客人消費權利~
台灣外送茶可可外送茶【賴211861】【賴211861】專營臺灣本土妹 #情愛全台灣外送茶看照約妹叫小姐 #台灣外送茶 全省外送茶外約援交茶訊魚訊匯總 line茶訊-台灣最大的茶訊、魚訊、外送茶外約網 台灣外送茶價位怎麼算?台灣找小姐上門服務看照約妹會遇雷嗎 台灣找小姐價位多少?看照約妹之台灣酒店找女人上門服務外送茶 援交、魚訊、茶訊、外送茶【賴211861】【賴211861】按摩網站導航 什麼是外送茶- 2020台灣外送茶小貼士 感?茶友的外送茶攻略投稿 - 悅人外送茶 台北外送茶– 茶莊外送茶全套外約叫小姐台灣網友最推薦 外送茶|台北曖昧外送茶即時外約 【賴211861】【賴211861】
台北外送茶彙整- 十八摸外約茶莊-全套-喝茶 【台北推薦】評價最好的5家外送茶!茶莊、價格、外約、到府服務 對味外送茶 讓你有戀愛感覺 台中外約- 叫小姐、外送茶迅速又安全,中部打炮首選- 天使心外約 維珍妮台中茶莊,台中叫小姐及台中外約! - COCO4.5K外送茶 台中外送茶彙整- 十八摸外約茶莊-全套-喝茶 台中女生名單– 糖果外送茶【看照約妹】 台中外送茶 - 激情娛樂外送茶莊 台中外送茶 台中外約學生妹台中一夜情 高雄24小時外約彙整- 十八摸外約茶莊-全套-喝茶 高雄外送茶有著2020茶莊界最好的美眉! 想在高雄叫小姐嗎 #高雄外送茶#高雄看照?妹#高雄叫小姐 高雄外送茶- 最夯E杯大奶妹,擁有傲人的上圍,讓你體驗波濤洶湧 老王-吃魚喝茶術語大全教學 所謂的喝茶就是援交或性交易【賴211861】【賴211861】小資族喝茶吃魚如何少花冤枉錢 萬維論壇 台灣喝茶吃魚可馨蘿莉幼齒學生妹甜美可愛清純粉 [討論] 關於吃魚喝茶心得分享的人- 看板sex - PTT網頁版 台灣喝茶吃魚可馨蘿莉幼齒學生妹甜美可愛清純粉 [討論] 關於吃魚喝茶心得分享的人- 看板sex - PTT網頁版 大台灣出差旅遊找小姐喝茶吃魚喝茶吃魚找小妹貼心 中文色情??,成人??,自拍,偷拍,成人??翻?? 情色網站大全- 成人網站- 色情網 成人貼圖區 - 一世發論壇 全球十大熱門成人網站排名【211861】【賴211861】線上直播網紅模式將成主流 台灣論壇,伊莉論壇區,維克斯論壇,論壇成人版,微風論壇--奇雅網 成人園地 SOGO論壇 夜遊討論- 伊莉討論區 水蜜桃外送茶拉莉塔外送茶海盜外送茶佳佳外送茶妮娜外送茶志玲外送茶小妖精外送茶小騷騷外送茶#台北夜遊論壇 夜遊討論~ 茶魚飯後閒聊版-魚訊交流歐洲論壇神奇論壇東歐個工 小司機帶路西斯板Dcard 夜遊論壇 - 新竹找茶,新竹找魚茶, 桃園中壢OL兼職, LINE 【心得】 夜遊論壇,按摩論壇【休閒娛樂】 魚訊與個工評價討論-歡樂論壇 夜遊討論區-貓都論壇 傑克論壇按摩舒壓理容 武士成人娛樂論壇娛樂網男人碼頭/夜遊討論一世一夜 外約學生妹約茶高檔正妹麻豆藝人小模空姐援交妹學生處女台灣蘿莉送茶吃魚喝茶人妻女優泰洗處女敢玩3P雙飛無套全場3K起【有圖】【賴211861】【賴211861】 #高雄外送茶,#高雄約炮,#高雄外約,#高雄吃魚喝茶,#高雄找小姐,#高雄全套,#高雄茶莊,#高雄茶訊【賴211861】【賴211861】 #高雄約炮神器,#高雄一夜情,#高雄炮友,#高雄買春,#高雄叫雞,#高雄嫖妓,台中外送茶 台中學生 台中一夜情 台中找小姐 台中全套茶旅館愛愛 台中單親媽媽 #高雄找炮友#高雄外送茶 #高雄外送茶,#高雄約炮,#高雄外約 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩 #台北半套 #台北找援交妹 #台北茶莊 #台北上門按摩 #台北找茶 #台北外約小姐 #台北找一夜情 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩約炮 #台北找援交妹 #台北茶莊 #台北上門按摩 #台北找茶 #台北外約小姐【賴211861】【賴211861】 #台北找一夜情 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩 #台北半套 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩 #台北找援交妹 #台北茶莊 #台北上門按摩 #台北找茶 #台北外約小姐 #台北找一夜情 #台北外約 #台北外送茶 #台北買春 #台北叫小姐 #台北叫全套 #台北按摩 外出茶妹臺北買春優質茶莊台灣蘿莉送茶臺灣嫖妓兼職外約臺北喝茶臺中喝茶高雄喝茶【賴211861】【賴211861】外送茶-叫小姐-外約-全套外送服

96
yt5206978 · #4 ·

+賴:5206978 可看照片 洗澡愛愛按摩口交全套服務 狂插 耐幹 奶泡
聽魚友介紹說她超讚 馬上衝來試一下 見面發現本人比照片好看很多啊! 【超驚喜 XD】 人很熱情很會聊天不會冷場 聊天聊到一半 妹子就自己坐到我身上撒嬌要親親 親到受不了 抱著她衝近了浴室洗澡 互相洗右手摟著我脖子 左手撫摸我下面 妹子慢慢從嘴巴親到脖子在慢慢的跪在地上幫我吹 邊吹邊看著我 這感覺真不錯 超會吹 差點就繳械 還好小弟忍住了 把妹子拉了起來 讓她扶著墻 從後面衝刺 幹到妹子 一直喊不要了 受不了 直到第一發結束 我們一起洗澡去了 床上和她一起做前戲 問她可不可以69 妹子同意了 就互相口 鮑魚很有感覺 粉粉的穴穴 不會像之前約的魚下面超黑 xd 妹子被口到受不了一直扭動著腰 流了很多愛液沒幾分鐘自己就顫抖了起來 說自己要去了 太舒服了~ 呻吟也叫的超淫蕩 ~ 等結束後 妹妹也不會馬上洗澡 還會抱著我躺一會 再拉著我一起去洗澡 超有女友fu ~ 做完評價:妹子很不錯 奶有D奶

服務十分 外貿十分 有女友fu 可69 喜歡上位 超會搖 【推薦出來各位大大要珍惜 妹子是短期兼職 】
密碼:160cm/D/47kg23歲
介紹人:阿傑
LINE : 5206978

96
xw233678 · #5 ·

+賴:233678 會玩水多 小母狗吹潮
介紹一個女生~小婉是個比較可憐缺愛的女生 一開始在賴上接觸小婉跟小婉聊天 覺得這女生蠻健談的 跟她的共同話題還是蠻多的 之後跟她約的時候我很激動 我們約在旅館的 小婉剛進房間就給我一個擁抱 慢慢的就到舌吻 在後面小婉就自己解開我的皮帶 脫下我的褲子 小舌頭會先在你的龜頭上纏繞 然後一口含住一吸一含爽翻了 實在是忍不住了把小婉拉起來讓她扶着墻 硬邦邦的肉棒從後面插進去 小婉就臉紅紅了 聲音甜甜的 叫床聲音也是 幹到小婉一直喊不要了~ 受不了了~ 小婉是一個蠻不錯的女生服務也很好 會主動為你口 按摩 配合好的話可以69 冰火口交 清搶 帝王浴做完也不會給趕時間
客評:小弟已經試過很多次了 全程下來是真的不錯很主動 健談不趕時間 很會撩
介紹人:小晨
密碼:162 D 24y
Line:233678

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up