【Android】ListView 顶部浮动栏效果.md

ListView 中有时需要在顶部固定一个浮动栏,当向上滑动 ListView 时,浮动栏固定在顶部,当向下滑动 ListView 到其 HeaderView 可见时,浮动栏成为ListView的一部分,与ListView一起滑动。效果如下:

实现思路

使用两个浮动栏,一个浮动栏(A)添加到 ListView 的 HeaderView中,另一个浮动栏(B)与ListView顶部对齐布局。当ListView下滑超过浮动栏时,隐藏浮动栏(B),此时用户看到的是浮动栏(A);当ListView上滑超过浮动栏时显示浮动栏(B),此时用户看到的是浮动栏(B)。

demo 代码

代码不多,就直接贴出来了。代码很简单,可以根据需要修改应用到自己的项目中。

activity_main.xml是一个相对布局,包含两个子标签:一个ListView和一个FrameLayout。FrameLayout通过<include>标签包含浮动栏布局,其创建时处于隐藏状态。include_floatbar.xml是浮动栏的布局文件,listitem_headview.xml是 ListView 的 HeaderView 布局文件。

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentTop="true"
        android:fadingEdge="none"
        />
    <FrameLayout
        android:id="@+id/float_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"
        >
        <include
            layout="@layout/include_floatbar"
            />
    </FrameLayout>
</RelativeLayout>

include_floatbar.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="40dp"
    android:layout_alignParentTop="true"
    android:background="#0F0"
    >
    <TextView
        android:text="浮动栏"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
</FrameLayout>

listitem_headview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/head_lv"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="150dp"
    android:background="#8F00"
    >
    <TextView
        android:text="ListView 头部"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

MainActivity中首先获取 ListView 的 ID,然后从布局文件创建 ListView 的 HeaderView,给 ListView 设置适配器,并监听 ListView 的滚动事件以决定什么时候隐藏或显示浮动栏。

MainActivity.java

package com.example.testlistviewtopfloatbar;

import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends FragmentActivity {
    private Context mContext;
    private ListView mListView;
    private View mHeadView;
    private View mFloatBarInLvHeader;
    private View mFloatBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mContext = this;
        mListView = (ListView)findViewById(R.id.lv);
        // ListView 顶部隐藏的浮动栏
        mFloatBar = findViewById(R.id.float_bar);

        // ListView 第一个头部控件(效果图中的红色区域)
        mHeadView = LayoutInflater.from(mContext).inflate(R.layout.listitem_headview, mListView, false);
        mListView.addHeaderView(mHeadView);
        // ListView 第二个头部控件(浮动栏)
        mFloatBarInLvHeader = LayoutInflater.from(mContext).inflate(R.layout.include_floatbar, mListView, false);
        mListView.addHeaderView(mFloatBarInLvHeader);

        List<String> data = new ArrayList<>(100);
        for (int i = 0; i < 100; ++i) {
            data.add(String.valueOf(i));
        }
        ArrayAdapter<String> adpater = new ArrayAdapter<>(mContext,
                android.R.layout.simple_list_item_1, data);
        mListView.setAdapter(adpater);
        mListView.setSelection(1);
        // 监听 ListView 滑动事件
        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                 /* 判断ListView头部中的浮动栏(mFloatBarInLvHeader)当前是否可见
                  * 来决定隐藏或显示浮动栏(mFloatBar)*/
                if (firstVisibleItem >= 1) {
                    mFloatBar.setVisibility(View.VISIBLE);
                } else {
                    mFloatBar.setVisibility(View.GONE);
                }
            }
        });
    }
}
时间: 2024-10-09 06:59:30

【Android】ListView 顶部浮动栏效果.md的相关文章

android listview 不显示选中效果分析

android listview有时会发现没有选中效果,解决办法 1:listview布局中设置颜色,如 android:background="@android:color/white" 2:在listview的item布局文件中背景设置为 android:background="@android:color/transparent" 原因:颜色设置在整体的listview上面,每一行布局设置透明色即可 android listview 不显示选中效果分析

Android之仿今日头条顶部导航栏效果

随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以有加了顶部导航栏. 今日头条顶部导航栏区域的主要部分是一个导航菜单.导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面.当用户在ViewPager区域滑动页面时,对应的导航菜单标签也会相应的被选中,选中的标签通过一个矩形红框高亮显示,红框背

Android ListView实现各种动画效果ListViewAnimations

效果图: 以卡片的形式: 以GridView的形式: 以透明度渐变.分别向左右上下不通方向飞入: (整个ListView的效果)            ListView中items的效果: 长按单个item进行位置移动:    删除单个item: 同时选择删除多个item: 点击单个item的事件. 第三方控件 源代码: 链接:http://pan.baidu.com/s/1kTimSFd 密码:lel211

Android ListView标题置顶效果实现

一. 有图有真相     二.实现: 1. 基于ListView分类效果 2. TitleView即标题的处理(创建) 3. 处理TitleView的三种状态 三.源码: 例子下载 实现可以看代码,具体描述以后再添加. 转载请注明出处:http://blog.csdn.net/love_world_/article/details/8011101

android listView二级目录选中效果

一.listView的二级目录且选中实现: 记录下来,以便以后可能会用到,直接上贴源码: 先上效果图:                   主界面: public class MainActivity extends Activity { // 树形Listview显示类别 private ExpandableListView listview1; // 一级 private List<String> groups; // 二级 private List<List<String&g

Android 简单实现ListView顶部悬浮效果

首先上效果图,实现如下效果: 起初在网上搜了下实现这样的效果,美团网,大众点评的"购买框"悬浮效果也是这样的,不过作者实现比较麻烦,自己想了想就根据ListView提供的一些特性进行了简单实现. 整个主要布局就是一个ListView,如果listview的上面有内容且高度比较高,可以把它当做listview的header,这样也可以避免ScrollView嵌套ListView带来的麻烦(记住这一点就不会在平时出现ScrollView与ListView各种问题了).要实现悬浮效果,主要是

[Android Pro] android控件ListView顶部或者底部也显示分割线

reference to  :  http://blog.csdn.net/lovexieyuan520/article/details/50846569 在默认的Android控件ListView在顶部是不显示分割线的,但是我们可以使用一些技巧来显示.我们先来看下默认情况下ListView显示的效果: 可以看到顶部是没有分割线的,但是有时候我们的美工硬是在上面画了一条分割线,没办法,我们也得加上,我们在ListView顶部加上一个Header就可以实现,代码如下 listView.addHea

Android ListView 侧滑效果实现(滑动展开、滑动删除)

转载请注明出处:http://blog.csdn.net/lonelyroamer/article/details/42439875 项目需要ListView滑动删除的效果,首先肯定是拿来主义,在网上搜了一遍,发现这样的东西真不少,比较有名的Github上的SwipeListView.但是个人尝试了一下,发现它的bug不少,并且达不到我想要的效果.于是又尝试了一下其他的例子,发现基本效果都有,但是都有不少问题.要么事件冲突,要么OnItemListView或者某个Button响应不了.没办法,只

Android listview回滚到顶部问题

============问题描述============ Android listview分页加载数据后,总是回滚到顶部,应该怎么防止其回滚到顶部? ============解决方案1============ 在数据获取完设置listview.setSelection(listview.getCount() - 1);刷新的时候数据还没有请求完,把数据变化的地方listview.getCount()打印出来看看有变化么.