預(yù)期效果:
RecyclerView頂部帶搜索框(LLSearch)硅瞧。默認LLSearch處于可見狀態(tài),手指向上滑動時恕汇,LLSearch不可見腕唧;手指向下滑動時,LLSearch可見瘾英。
實現(xiàn)思路:
1.在XML中枣接,RV和LLSearch外層使用FrameLayout包裹,LLSearch置于RV上層缺谴,RV添加與LLSearch同等高度的top
2.在Java類中但惶,給RV添加滑動監(jiān)聽(OnScrollListener),重寫onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy)方法湿蛔,其中膀曾,當(dāng)dy>0時,表示手指上滑阳啥,內(nèi)容下移添谊,此時搬泥,隱藏LLSearch(添加不添加動畫吸奴,看個人偏好);當(dāng)dy<0時,表示手指下滑初茶,內(nèi)容上移扎瓶,此時所踊,顯示LLSearch;
效果圖:
附代碼:
XML:
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:paddingTop="@dimen/dp_58"
android:overScrollMode="never"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/ll_search"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_33"
android:layout_marginHorizontal="@dimen/dp_15"
android:layout_marginTop="@dimen/dp_15"
android:background="@drawable/bg_f5f6f7_r_5"
android:gravity="center_vertical"
android:padding="@dimen/dp_10">
<EditText
android:id="@+id/et_search"
android:layout_width="@dimen/dp_0"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@null"
android:hint="請輸入搜索關(guān)鍵詞"
android:imeOptions="actionSearch"
android:inputType="text"
android:textColor="@color/color_333333"
android:textSize="@dimen/sp_12" />
<ImageView
android:id="@+id/iv_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_clear"
android:visibility="gone" />
</LinearLayout>
</FrameLayout>
Java類:
mBinding.rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
RecyclerView.LayoutManager lm = recyclerView.getLayoutManager();
if (lm instanceof LinearLayoutManager) {
int i = ((LinearLayoutManager) lm).findFirstCompletelyVisibleItemPosition();
if (dy < 0) {//手指下滑
if (i >= 0) {//position>=0,設(shè)置為可見
setLLSearchVisible(true);
}
} else if (dy > 0) {//手指上滑
if (i > 1) {//position>1概荷,設(shè)置為不可見可見
setLLSearchVisible(false);
}
}
}
}
});
private void setLLSearchVisible(boolean visible) {
if (visible) {
if (mBinding.llSearch.getVisibility() == View.VISIBLE) {
return;
}
mBinding.llSearch.setVisibility(View.VISIBLE);
mBinding.rv.setPadding(0, SizeUtils.dp2px(58), 0, 0);
} else {
if (mBinding.llSearch.getVisibility() == View.GONE) {
return;
}
mBinding.llSearch.setVisibility(View.GONE);
mBinding.rv.setPadding(0, SizeUtils.dp2px(0), 0, 0);
}
}