工作中遇到一个需求,列表滚动时要把其中一个item 悬浮在手机屏幕顶部。搞android 好几年了,我对自定义view一般都是改别人的。
主要还是看需求,如果效果简单,组合几个view就可以达到效果,自己就顺手写了,如果自我感觉复杂一下,肯定baidu 改别人的。
先看看这个简单的效果:
实现方式:
1:根据需求定位需要悬浮的item, 我这里是第二个条目。
2:定位停留位置:也就是悬浮在顶部,正好api有个方法
linearManager.findFirstVisibleItemPosition(),可以定位到第一个可见条目。
3:在悬浮view位置覆盖一层相同的item。这个就需要在activity的布局中写。
4:注意Recycle所在的这个activity要用FrameLayout,也就是将recycleview和悬浮view 都放在
FrameLayout中。否则放在LinearLayout中会跳动,relativelayout 没有试。
5:监听悬浮view和item重合的时候,也就是findFirstVisibleItemPosition()==悬浮item的索引 。
当列表向上滚动时,findFirstVisibleItemPosition()和悬浮item的索引 重合时 ,停留固定悬浮view。
当列表向下滚动时,findFirstVisibleItemPosition()+1 和悬浮item的索引 重合时 ,隐藏悬浮view。
具体核心代码:首先将悬浮view隐藏
ll_floatview :表示悬浮view.
ll_floatview.setVisibility(View.GONE);//首先将悬浮view隐藏
recyclerview.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int firstVisible = linearManager.findFirstVisibleItemPosition();
DebugUtil.e("dx:" + dx + "--dy:" + dy);
DebugUtil.e("firstVisible" + firstVisible);
if (dy > 0) {
//列表往上划动
if (firstVisible == 1) {
ll_floatview.setVisibility(View.VISIBLE);
}
} else {
//列表往下划动
if (firstVisible == 0) {
ll_floatview.setVisibility(View.GONE);
}
}
}
});
activity布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/default_background"
android:orientation="vertical">
<include layout="@layout/common_title_layout" />
<!-- 注意要用Framelayout-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible" />
</RelativeLayout>
<LinearLayout
android:id="@+id/ll_floatview"
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/red"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_volunteering"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/tv_volunteering"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在资助"
android:textColor="@color/color_55a8a8a8"
android:textSize="@dimen/text_size_16" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_volunteered"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/tv_volunteered"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已资助"
android:textColor="@color/text_color_585858"
android:textSize="@dimen/text_size_16" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/tv_line"
android:layout_width="120dp"
android:layout_height="3dp"
android:background="@color/yellow_FFA412" />
</LinearLayout>
</FrameLayout>
</LinearLayout>
final int TYPE_HEADER = 1;
final int TYPE_HEADER_2 = 2;
final int TYPE_ITEM = 3;
TYPE_HEADER_2 布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/default_background"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@color/red"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="48dp"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_volunteering"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/tv_volunteering"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在资助"
android:textColor="@color/color_55a8a8a8"
android:textSize="@dimen/text_size_16" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_volunteered"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center">
<TextView
android:id="@+id/tv_volunteered"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="已资助"
android:textColor="@color/text_color_585858"
android:textSize="@dimen/text_size_16" />
</LinearLayout>
</LinearLayout>
<View
android:id="@+id/tv_line"
android:layout_width="120dp"
android:layout_height="3dp"
android:background="@color/yellow_FFA412" />
</LinearLayout>
</LinearLayout>