search
HomeWeb Front-endHTML TutorialExample of sliding ListView to automatically hide the head and bottom elements of the page_html/css_WEB-ITnose

The complete engineering code is here: https://github.com/NashLegend/Auto-Hide-ListView


Many software now have this kind of sliding The function of automatically hiding the head and bottom elements of the page when listing, such as Google. When you first enter the Activity, the page is a list with a view at the bottom and a view at the head. When the list slides up, the head and tail elements are hidden to show more content. When the list slides down, the Pull out the head and tail elements. Such as Google.


This is what it looked like when you first entered:

Pull the list over again, hiding the head and tail, and it’s done It looks like this:


If you scroll down, it will change back to the first picture.


This example implements this function


In this example, the layout of MainActivity is as follows, and ToolBar is the top element , Button is the bottom element.

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">     <listview android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="match_parent" android:headerdividersenabled="false"></listview>     <android.support.v7.widget.toolbar android:id="@+id/action_bar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/holo_blue_light"></android.support.v7.widget.toolbar>     <button android:id="@+id/footer" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentbottom="true" android:text="@string/ScrollDown"></button></relativelayout>

public class MainActivity extends ActionBarActivity {     ListView listView;    Toolbar toolbar;    View header;    View footer;    int touchSlop = 10;     @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        touchSlop = (int) (ViewConfiguration.get(MainActivity.this).getScaledTouchSlop() * 0.9);//滚动过多少距离后才开始计算是否隐藏/显示头尾元素。这里用了默认touchslop的0.9倍。        listView = (ListView) findViewById(R.id.list_view);        footer = findViewById(R.id.footer);        toolbar = (Toolbar) findViewById(R.id.action_bar);        // 下面这句将这个ToolBar设置为ActionBar,在这个例子里面,这句其实用不着,但是如果用了这句,就得把Theme设置为NoActionBar了,无关这里要说的,具体见上面的链接中的Style        setSupportActionBar(toolbar);                 //为这个ListView填充元素。        String[] str = new String[64];        for (int i = 0; i  adapter = new ArrayAdapter(MainActivity.this, R.layout.simple_layout, str);        listView.setAdapter(adapter);                 //为ListView添加一个Header,这个Header与ToolBar一样高。这样我们可以正确的看到列表中的第一个元素而不被遮住。        header = new View(MainActivity.this);        header.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.abc_action_bar_default_height_material)));        header.setBackgroundColor(Color.parseColor("#00000000"));        listView.addHeaderView(header);                 //为ListView设置触摸事件和滚动事件,这是核心        listView.setOnTouchListener(onTouchListener);        listView.setOnScrollListener(onScrollListener);        footer.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //为button设置点击事件,点击一次滚动10个item                listView.smoothScrollByOffset(10);            }        });    }     @Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }     @Override    public boolean onOptionsItemSelected(MenuItem item) {        int id = item.getItemId();        if (id == R.id.action_settings) {            return true;        }        return super.onOptionsItemSelected(item);    }     AnimatorSet backAnimatorSet;//这是显示头尾元素使用的动画     private void animateBack() {        //先清除其他动画        if (hideAnimatorSet != null && hideAnimatorSet.isRunning()) {            hideAnimatorSet.cancel();        }        if (backAnimatorSet != null && backAnimatorSet.isRunning()) {            //如果这个动画已经在运行了,就不管它        } else {            backAnimatorSet = new AnimatorSet();            //下面两句是将头尾元素放回初始位置。            ObjectAnimator headerAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), 0f);            ObjectAnimator footerAnimator = ObjectAnimator.ofFloat(footer, "translationY", footer.getTranslationY(), 0f);            ArrayList<animator> animators = new ArrayList();            animators.add(headerAnimator);            animators.add(footerAnimator);            backAnimatorSet.setDuration(300);            backAnimatorSet.playTogether(animators);            backAnimatorSet.start();        }    }     AnimatorSet hideAnimatorSet;//这是隐藏头尾元素使用的动画     private void animateHide() {        //先清除其他动画        if (backAnimatorSet != null && backAnimatorSet.isRunning()) {            backAnimatorSet.cancel();        }        if (hideAnimatorSet != null && hideAnimatorSet.isRunning()) {            //如果这个动画已经在运行了,就不管它        } else {            hideAnimatorSet = new AnimatorSet();            ObjectAnimator headerAnimator = ObjectAnimator.ofFloat(toolbar, "translationY", toolbar.getTranslationY(), -toolbar.getHeight());//将ToolBar隐藏到上面            ObjectAnimator footerAnimator = ObjectAnimator.ofFloat(footer, "translationY", footer.getTranslationY(), footer.getHeight());//将Button隐藏到下面            ArrayList<animator> animators = new ArrayList();            animators.add(headerAnimator);            animators.add(footerAnimator);            hideAnimatorSet.setDuration(200);            hideAnimatorSet.playTogether(animators);            hideAnimatorSet.start();        }    }     View.OnTouchListener onTouchListener = new View.OnTouchListener() {          float lastY = 0f;        float currentY = 0f;        //下面两个表示滑动的方向,大于0表示向下滑动,小于0表示向上滑动,等于0表示未滑动        int lastDirection = 0;        int currentDirection = 0;         @Override        public boolean onTouch(View v, MotionEvent event) {            switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:                    lastY = event.getY();                    currentY = event.getY();                    currentDirection = 0;                    lastDirection = 0;                    break;                case MotionEvent.ACTION_MOVE:                    if (listView.getFirstVisiblePosition() > 0) {                        //只有在listView.getFirstVisiblePosition()>0的时候才判断是否进行显隐动画。因为listView.getFirstVisiblePosition()==0时,                        //ToolBar??也就是头部元素必须是可见的,如果这时候隐藏了起来,那么占位置用了headerview就被用户发现了                        //但是当用户将列表向下拉露出列表的headerview的时候,应该要让头尾元素再次出现才对??这个判断写在了后面onScrollListener里面……                        float tmpCurrentY = event.getY();                        if (Math.abs(tmpCurrentY - lastY) > touchSlop) {//滑动距离大于touchslop时才进行判断                            currentY = tmpCurrentY;                            currentDirection = (int) (currentY - lastY);                            if (lastDirection != currentDirection) {                                //如果与上次方向不同,则执行显/隐动画                                if (currentDirection  0) {                if (firstVisibleItem > lastPosition && state == SCROLL_STATE_FLING) {                    //如果上次的位置小于当前位置,那么隐藏头尾元素                    animateHide();                }                                 //================================                if (firstVisibleItem  <br> <br> <p></p> </animator></animator>
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
What is the purpose of the <datalist> element?What is the purpose of the <datalist> element?Mar 21, 2025 pm 12:33 PM

The article discusses the HTML <datalist> element, which enhances forms by providing autocomplete suggestions, improving user experience and reducing errors.Character count: 159

What is the purpose of the <progress> element?What is the purpose of the <progress> element?Mar 21, 2025 pm 12:34 PM

The article discusses the HTML <progress> element, its purpose, styling, and differences from the <meter> element. The main focus is on using <progress> for task completion and <meter> for stati

What is the purpose of the <meter> element?What is the purpose of the <meter> element?Mar 21, 2025 pm 12:35 PM

The article discusses the HTML <meter> element, used for displaying scalar or fractional values within a range, and its common applications in web development. It differentiates <meter> from <progress> and ex

What is the purpose of the <iframe> tag? What are the security considerations when using it?What is the purpose of the <iframe> tag? What are the security considerations when using it?Mar 20, 2025 pm 06:05 PM

The article discusses the <iframe> tag's purpose in embedding external content into webpages, its common uses, security risks, and alternatives like object tags and APIs.

What is the viewport meta tag? Why is it important for responsive design?What is the viewport meta tag? Why is it important for responsive design?Mar 20, 2025 pm 05:56 PM

The article discusses the viewport meta tag, essential for responsive web design on mobile devices. It explains how proper use ensures optimal content scaling and user interaction, while misuse can lead to design and accessibility issues.

How do I use HTML5 form validation attributes to validate user input?How do I use HTML5 form validation attributes to validate user input?Mar 17, 2025 pm 12:27 PM

The article discusses using HTML5 form validation attributes like required, pattern, min, max, and length limits to validate user input directly in the browser.

What are the best practices for cross-browser compatibility in HTML5?What are the best practices for cross-browser compatibility in HTML5?Mar 17, 2025 pm 12:20 PM

Article discusses best practices for ensuring HTML5 cross-browser compatibility, focusing on feature detection, progressive enhancement, and testing methods.

How do I use the HTML5 <time> element to represent dates and times semantically?How do I use the HTML5 <time> element to represent dates and times semantically?Mar 12, 2025 pm 04:05 PM

This article explains the HTML5 <time> element for semantic date/time representation. It emphasizes the importance of the datetime attribute for machine readability (ISO 8601 format) alongside human-readable text, boosting accessibilit

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
2 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft