最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android tabLayout+recyclerView實(shí)現(xiàn)錨點(diǎn)定位的示例

 更新時(shí)間:2018年08月06日 09:18:42   作者:春風(fēng)十里不如認(rèn)識(shí)你 春風(fēng)十里不如認(rèn)識(shí)你  
這篇文章主要介紹了Android tabLayout+recyclerView實(shí)現(xiàn)錨點(diǎn)定位的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

在上一篇文章Android 實(shí)現(xiàn)錨點(diǎn)定位中,我們介紹了tablayout+scrollView實(shí)現(xiàn)的錨點(diǎn)定位,今天我們使用tablayout+recyclerView 來實(shí)現(xiàn)同樣的效果。 

效果圖:

實(shí)現(xiàn)思路

實(shí)現(xiàn)的思路與上一篇文章是一致的: 

1、監(jiān)聽recyclerView滑動(dòng)到的位置,tablayout切換到對(duì)應(yīng)標(biāo)簽 
2、tablayout各標(biāo)簽點(diǎn)擊,recyclerView可滑動(dòng)到對(duì)應(yīng)區(qū)域

數(shù)據(jù)模擬

數(shù)據(jù)模擬,使用上一文章的AnchorView作為recyclerView的每個(gè)字view,同時(shí)這里對(duì)recyclerView的最后一個(gè)子view的高度進(jìn)行修改,讓其充滿屏幕。

private LinearLayoutManager manager;
private String[] tabTxt = {"客廳", "臥室", "餐廳", "書房", "陽臺(tái)", "兒童房"};
//判讀是否是recyclerView主動(dòng)引起的滑動(dòng),true- 是,false- 否,由tablayout引起的
private boolean isRecyclerScroll;
//記錄上一次位置,防止在同一內(nèi)容塊里滑動(dòng) 重復(fù)定位到tablayout
private int lastPos;
//用于recyclerView滑動(dòng)到指定的位置
private boolean canScroll;
private int scrollToPosition;

//tablayout設(shè)置標(biāo)簽
for (int i = 0; i < tabTxt.length; i++) {
  tabLayout.addTab(tabLayout.newTab().setText(tabTxt[i]));
}

//計(jì)算內(nèi)容塊所在的高度,全屏高度-狀態(tài)欄高度-tablayout的高度(這里固定高度50dp),用于recyclerView的最后一個(gè)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));


@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
  holder.anchorView.setContentTxt(tabTxt[position]);
  holder.anchorView.setAnchorTxt(tabTxt[position]);
  //判斷最后一個(gè)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滑動(dòng)定位

當(dāng)recyclerView滑動(dòng)引起的,addOnScrollListener的onScrolled的監(jiān)聽第一個(gè)可見view的位置,直接將tablayout定位到相應(yīng)的位置。

recyclerView.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    //當(dāng)滑動(dòng)由recyclerView觸發(fā)時(shí),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) {
      //第一個(gè)可見的view的位置,即tablayou需定位的位置
      int position = manager.findFirstVisibleItemPosition();
      if (lastPos != position) {
        tabLayout.setScrollPosition(position, 0, true);
      }
      lastPos = position;
    }
  }
});

tablayout切換定位

點(diǎn)擊tablayout進(jìn)行切換,recyclerView需要滑動(dòng)到相應(yīng)的位置,注意這里需要根據(jù)跳轉(zhuǎn)位置不同,進(jìn)行相應(yīng)的滑動(dòng)。

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
  @Override
  public void onTabSelected(TabLayout.Tab tab) {
    //點(diǎn)擊標(biāo)簽,使recyclerView滑動(dòng),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) {
  // 第一個(gè)可見的view的位置
  int firstItem = manager.findFirstVisibleItemPosition();
  // 最后一個(gè)可見的view的位置
  int lastItem = manager.findLastVisibleItemPosition();
  if (position <= firstItem) {
    // 如果跳轉(zhuǎn)位置firstItem 之前(滑出屏幕的情況),就smoothScrollToPosition可以直接跳轉(zhuǎn),
    mRecyclerView.smoothScrollToPosition(position);
  } else if (position <= lastItem) {
    // 跳轉(zhuǎn)位置在firstItem 之后,lastItem 之間(顯示在當(dāng)前屏幕),smoothScrollBy來滑動(dòng)到指定位置
    int top = mRecyclerView.getChildAt(position - firstItem).getTop();
    mRecyclerView.smoothScrollBy(0, top);
  } else {
    // 如果要跳轉(zhuǎn)的位置在lastItem 之后,則先調(diào)用smoothScrollToPosition將要跳轉(zhuǎn)的位置滾動(dòng)到可見位置
    // 再通過onScrollStateChanged控制再次調(diào)用當(dāng)前moveToPosition方法,執(zhí)行上一個(gè)判斷中的方法
    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);
    }
  }
});

至此,兩種實(shí)現(xiàn)錨點(diǎn)定位的方法就介紹到這里,希望能幫助到讀者在實(shí)際項(xiàng)目中的使用。  

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

詳細(xì)代碼見 

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

伊吾县| 湘乡市| 阳山县| 新平| 贺州市| 平顺县| 巩留县| 房山区| 工布江达县| 贵南县| 沙湾县| 华阴市| 望谟县| 天等县| 芜湖县| 额尔古纳市| 柳州市| 浙江省| 柏乡县| 汕头市| 广德县| 新巴尔虎左旗| 根河市| 甘洛县| 尚志市| 高陵县| 海南省| 东宁县| 石屏县| 沈丘县| 泸西县| 枣强县| 五河县| 临澧县| 河东区| 弋阳县| 都兰县| 金华市| 密云县| 乡宁县| 青浦区|