1. 程式人生 > >自動顯示和隱藏頭佈局的ListView原來是那麼簡單

自動顯示和隱藏頭佈局的ListView原來是那麼簡單

前言:

今天在看Android進階的書籍,發現越看越有趣,當我看到自動顯示、隱藏佈局的ListView時,內心充滿了好奇和期待,因為即將就要解開我心中當年存在的一個迷,之前我剛接觸Android的時候,總是在想為什麼淘寶還有京東等一些APP可以實現自動顯示和隱藏頭佈局呢?今天我就發自內心地寫這篇部落格了!接下來就讓帶大家見證奇蹟的時刻了。

一、首先,給ListView新增一個HeaderView,避免第一個Item被頭佈局遮擋:

//1.給listview增加HeaderView
View header = new View(this);
header.setLayoutParams(new AbsListView.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT,
        // 高度根據螢幕不一樣,大小不一
        // (此處可以使用 R.dimen.abc_action_bar_default_height_material)
        (int) getResources().getDimension(
                R.dimen.abc_action_bar_default_height_material)));
mlistview.addHeaderView(header);

二、定義變數設定listview最小滑動距離(系統獲取的)

//2.獲取系統認為的最低滑動距離
minInstance = ViewConfiguration.get(this).getScaledTouchSlop();

三、設定listview的滑動監聽事件,比較與上次座標的大小,即根據座標差來判斷滑動的方向,如果是向上滑動的話就隱藏頭佈局,向下滑動的話就設定顯示頭佈局:

//3.判斷滑動事件
mlistview.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mFirstY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mCurrentY = event.getY();
                if (mCurrentY - mFirstY > minInstance) {
                    status = 0;  // 向下
                } else {
                    status = 1;  // 向上
                }
                if (status == 1) {
                    if (mShow) {
                        barAnim(1);  // 隱藏
                        mShow = false;
                    }
                } else {
                    if (!mShow) {
                        barAnim(0); // 顯示
                        mShow = true;
                    }
                }
                break;
        }
        return false;
    }
});

四、最後一步加上頭佈局的顯示、隱藏動畫的設定方法:

private void barAnim(int i) {
    if (animator != null && animator.isRunning())
        animator.cancel();
    if (i == 0) {
        animator = ObjectAnimator.ofFloat(
                titlebar,
                "translationY",
                titlebar.getTranslationY(),
                0);
    }else{
        animator = ObjectAnimator.ofFloat(
                titlebar,
                "translationY",
                titlebar.getTranslationY(),
                -titlebar.getHeight());
        }
    animator.start();
}

就是這麼簡單,向下滑動 ListView ,其頂部佈局自動顯示;向上滑動 ListView ,其頂部的佈局自動隱藏!先給大家看看效果圖吧!

到此,大家可以可以簡單做個listview去實現一下效果,這裡的標頭檔案是用一個Textview寫的,如果大家要用toolbar的話,就要注意了,記得主題一定是要NoActionBar的,即:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

有需要完整原始碼的帥哥美女們,看這裡:Demo

更多精彩內容請

掃一掃關注我的微信公眾號:程式猿在廣東