安卓开发实现CoordinatorLayout+AppBarLayout+TabLayout+RecycleView 悬停效果 滑动列表tabLayout定位

编程入门 行业动态 更新时间:2024-10-07 02:18:22

安卓开发实现CoordinatorLayout+AppBarLayout+TabLayout+RecycleView 悬停<a href=https://www.elefans.com/category/jswz/34/1770448.html style=效果 滑动列表tabLayout定位"/>

安卓开发实现CoordinatorLayout+AppBarLayout+TabLayout+RecycleView 悬停效果 滑动列表tabLayout定位

在安卓中实现CoordinatorLayout+AppBarLayout+TabLayout+RecycleView 悬停效果 滑动rv列表tablayout定位效果

效果图

在开发中要用到 写个demo 记录一下,有这个需求的同志也可以做个参考

Xml

<FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"xmlns:android=""xmlns:tools=""xmlns:app=""><android.support.design.widget.CoordinatorLayoutandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><android.support.design.widget.AppBarLayoutandroid:id="@+id/app_bar"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:text="哈哈哈哈哈"app:layout_scrollFlags="scroll"/><ImageViewandroid:id="@+id/iv_tag"android:layout_width="match_parent"android:layout_height="200dp"android:background="?attr/colorPrimary"android:scaleType="fitXY"app:layout_collapseMode="parallax"android:src="@drawable/ic_launcher_background"app:layout_scrollFlags="scroll|exitUntilCollapsed" /><android.support.design.widget.TabLayoutandroid:id="@+id/main_tab"android:layout_width="match_parent"android:layout_height="50dp"android:visibility="gone"/><TextViewandroid:id="@+id/tv_test"android:layout_width="match_parent"android:layout_height="50dp"android:text="哈哈哈哈哈"android:visibility="visible"/></android.support.design.widget.AppBarLayout><android.support.v7.widget.RecyclerViewandroid:id="@+id/mian_recy"android:layout_width="match_parent"android:layout_height="wrap_content"app:layout_behavior="@string/appbar_scrolling_view_behavior"/></android.support.design.widget.CoordinatorLayout></FrameLayout>

View

 private List<MainBean> list;private MainAdapter adapter;private RecyclerView recyclerView;private LinearLayoutManager manager;private TabLayout tabLayout;/***关于bug问题,可以在adapter 中给最后一个item 填充一个空视图把整个布局顶上去完成滑动*demo中就给到一个思路了**/private  int pos=0;private TextView tv_test;private AppBarLayout appBarLayout;private String[] str = {"测试1", "测试2", "测试3", "测试4", "测试5", "测试6", "测试7", "测试8", "测试9", "测试10"};private ImageView iv_tag;private int[] str1 = {0, 11, 22, 33, 44, 55, 66, 77, 88, 99};private boolean isScrolled = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initData();init();initTab();//因为需求原因这里先放置点击收缩appbar的占位视图tv_test.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if (pos<250){//这里可以根据实际情况来做出appbar的收缩判断 高度可以通过自己计算appBarLayout.setExpanded(false);}}});}private void initTab() {for (int i = 0; i < str.length; i++) {tabLayout.addTab(tabLayout.newTab().setText(str[i]));}//标签页可以滑动tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {int pos = tab.getPosition();if (!isScrolled) {manager.scrollToPositionWithOffset(str1[pos], 0);}}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}});}private void init() {recyclerView = findViewById(R.id.mian_recy);tabLayout = findViewById(R.id.main_tab);appBarLayout=findViewById(R.id.app_bar);tv_test=findViewById(R.id.tv_test);iv_tag=findViewById(R.id.iv_tag);manager = new LinearLayoutManager(this);recyclerView.setLayoutManager(manager);adapter = new MainAdapter(list);recyclerView.setAdapter(adapter);adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {@Overridepublic void onItemClick(BaseQuickAdapter adapter, View view, int position) {//处理自己的事件Toast.makeText(MainActivity.this, "点击的item=" + position, Toast.LENGTH_SHORT).show();}});recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);//重写该方法主要是判断recyclerview是否在滑动//0停止 ,12都是滑动if (newState == 0) {isScrolled = false;} else {isScrolled = true;}setMsg("isScrolled" + isScrolled + "--newState=" + newState);}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);/*** 关于滑动rv 定位tab的实现逻辑  可根据自己的项目需要进行修改* **/if (isScrolled) {int top = manager.findFirstVisibleItemPosition();int bottom = manager.findLastVisibleItemPosition();int pos = 0;if (bottom == list.size() - 1) {//先判断滑到底部,tab定位到最后一个pos = str1.length - 1;} else if (top == str1[str1.length - 1]) {//如果top等于指定的位置,对应到tab即可,pos = str1[str1.length - 1];} else {//循环遍历,需要比较i+1的位置,所以循环长度要减1,//  如果 i<top<i+1,  那么tab应该定位到i位置的字符,不管是向上还是向下滑动for (int i = 0; i < str1.length - 1; i++) {if (top == str1[i]) {pos = i;break;} else if (top > str1[i] && top < str1[i + 1]) {pos = i;break;}}}//设置tab滑动到第pos个tabLayout.setScrollPosition(pos, 0f, true);}}});appBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {@Overridepublic void onOffsetChanged(AppBarLayout appBarLayout, int i) {Log.e(MainActivity.class.getSimpleName(), "onOffsetChanged: "+i);if (Math.abs(i)==iv_tag.getBottom()){pos=Math.abs(i);tv_test.setVisibility(View.GONE);tabLayout.setVisibility(View.VISIBLE);}else {pos=0;tabLayout.setVisibility(View.GONE);tv_test.setVisibility(View.VISIBLE);}}});}public static void setMsg(String str) {Log.i("tab", str);}private void initData() {list = new ArrayList<>();for (int i = 0; i < 100; i++) {list.add(new MainBean("title--" + i));}}
}

思路就是这些了,也非常的简单。

附上码云链接

更多推荐

安卓开发实现CoordinatorLayout+AppBarLayout+TabLayout+RecycleView 悬停效果 滑动列表tabLayout定位

本文发布于:2024-03-07 19:29:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1718708.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:效果   列表   AppBarLayout   CoordinatorLayout   卓开发

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!