国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android tabLayout+recyclerView實現錨點定位的示例

2019-10-21 21:42:37
字體:
來源:轉載
供稿:網友

在上一篇文章Android 實現錨點定位中,我們介紹了tablayout+scrollView實現的錨點定位,今天我們使用tablayout+recyclerView 來實現同樣的效果。  

效果圖:

Android,tabLayout,recyclerView,錨點定位

實現思路

實現的思路與上一篇文章是一致的:  

1、監聽recyclerView滑動到的位置,tablayout切換到對應標簽  
2、tablayout各標簽點擊,recyclerView可滑動到對應區域

數據模擬

數據模擬,使用上一文章的AnchorView作為recyclerView的每個字view,同時這里對recyclerView的最后一個子view的高度進行修改,讓其充滿屏幕。

private LinearLayoutManager manager;private String[] tabTxt = {"客廳", "臥室", "餐廳", "書房", "陽臺", "兒童房"};//判讀是否是recyclerView主動引起的滑動,true- 是,false- 否,由tablayout引起的private boolean isRecyclerScroll;//記錄上一次位置,防止在同一內容塊里滑動 重復定位到tablayoutprivate int lastPos;//用于recyclerView滑動到指定的位置private boolean canScroll;private int scrollToPosition;//tablayout設置標簽for (int i = 0; i < tabTxt.length; i++) {  tabLayout.addTab(tabLayout.newTab().setText(tabTxt[i]));}//計算內容塊所在的高度,全屏高度-狀態欄高度-tablayout的高度(這里固定高度50dp),用于recyclerView的最后一個item view填充高度int screenH = getScreenHeight();int statusBarH = getStatusBarHeight(this);int tabH = 50 * 3;int lastH = screenH - statusBarH - tabH;manager = new LinearLayoutManager(this);recyclerView.setLayoutManager(manager);recyclerView.setAdapter(new MyAdapter(this, tabTxt, lastH));@Overridepublic void onBindViewHolder(MyViewHolder holder, int position) {  holder.anchorView.setContentTxt(tabTxt[position]);  holder.anchorView.setAnchorTxt(tabTxt[position]);  //判斷最后一個view  if (position == tabTxt.length - 1) {    if (holder.anchorView.getHeight() < lastH) {      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);      params.height = lastH;      holder.anchorView.setLayoutParams(params);    }  }}

recyclerView滑動定位

當recyclerView滑動引起的,addOnScrollListener的onScrolled的監聽第一個可見view的位置,直接將tablayout定位到相應的位置。

recyclerView.setOnTouchListener(new View.OnTouchListener() {  @Override  public boolean onTouch(View v, MotionEvent event) {    //當滑動由recyclerView觸發時,isRecyclerScroll 置true    if (event.getAction() == MotionEvent.ACTION_DOWN) {      isRecyclerScroll = true;    }    return false;  }});recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {  @Override  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {    super.onScrolled(recyclerView, dx, dy);    if (isRecyclerScroll) {      //第一個可見的view的位置,即tablayou需定位的位置      int position = manager.findFirstVisibleItemPosition();      if (lastPos != position) {        tabLayout.setScrollPosition(position, 0, true);      }      lastPos = position;    }  }});

tablayout切換定位

點擊tablayout進行切換,recyclerView需要滑動到相應的位置,注意這里需要根據跳轉位置不同,進行相應的滑動。

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {  @Override  public void onTabSelected(TabLayout.Tab tab) {    //點擊標簽,使recyclerView滑動,isRecyclerScroll置false    int pos = tab.getPosition();    isRecyclerScroll = false;    moveToPosition(manager, recyclerView, pos);  }  @Override  public void onTabUnselected(TabLayout.Tab tab) {  }  @Override  public void onTabReselected(TabLayout.Tab tab) {  }});public void moveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int position) {  // 第一個可見的view的位置  int firstItem = manager.findFirstVisibleItemPosition();  // 最后一個可見的view的位置  int lastItem = manager.findLastVisibleItemPosition();  if (position <= firstItem) {    // 如果跳轉位置firstItem 之前(滑出屏幕的情況),就smoothScrollToPosition可以直接跳轉,    mRecyclerView.smoothScrollToPosition(position);  } else if (position <= lastItem) {    // 跳轉位置在firstItem 之后,lastItem 之間(顯示在當前屏幕),smoothScrollBy來滑動到指定位置    int top = mRecyclerView.getChildAt(position - firstItem).getTop();    mRecyclerView.smoothScrollBy(0, top);  } else {    // 如果要跳轉的位置在lastItem 之后,則先調用smoothScrollToPosition將要跳轉的位置滾動到可見位置    // 再通過onScrollStateChanged控制再次調用當前moveToPosition方法,執行上一個判斷中的方法    mRecyclerView.smoothScrollToPosition(position);    scrollToPosition = position;    canScroll = true;  }}recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {  @Override  public void onScrollStateChanged(RecyclerView recyclerView, int newState) {    super.onScrollStateChanged(recyclerView, newState);    if (canScroll) {      canScroll = false;      moveToPosition(manager, recyclerView, scrollToPosition);    }  }});

至此,兩種實現錨點定位的方法就介紹到這里,希望能幫助到讀者在實際項目中的使用。   

代碼與上一篇文章的在同一個git地址里。

詳細代碼見  

github地址:https://github.com/taixiang/tabScroll  

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台湾省| 焦作市| 丰原市| 黑河市| 呼图壁县| 马公市| 东山县| 湖北省| 白朗县| 三穗县| 两当县| 长岭县| 敦化市| 莲花县| 门源| 湄潭县| 樟树市| 阳高县| 婺源县| 兰州市| 田东县| 台东市| 塔河县| 抚松县| 浦东新区| 平阳县| 扶沟县| 永城市| 古蔺县| 江门市| 寿光市| 木兰县| 电白县| 白沙| 黄龙县| 治县。| 南充市| 民勤县| 股票| 响水县| 五常市|