真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

怎么在AndroidtabLayout中使用recyclerView實現錨點定位

怎么在Android tabLayout中使用recyclerView實現錨點定位?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

創(chuàng)新互聯自2013年創(chuàng)立以來,是專業(yè)互聯網技術服務公司,擁有項目成都網站設計、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元賓陽做網站,已為上家服務,為賓陽各地企業(yè)和個人服務,聯系電話:13518219792

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發(fā)。

實現思路

1、監(jiān)聽recyclerView滑動到的位置,tablayout切換到對應標簽  

2、tablayout各標簽點擊,recyclerView可滑動到對應區(qū)域

數據模擬

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

private LinearLayoutManager manager;
private String[] tabTxt = {"客廳", "臥室", "餐廳", "書房", "陽臺", "兒童房"};
//判讀是否是recyclerView主動引起的滑動,true- 是,false- 否,由tablayout引起的
private boolean isRecyclerScroll;
//記錄上一次位置,防止在同一內容塊里滑動 重復定位到tablayout
private 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]));
}

//計算內容塊所在的高度,全屏高度-狀態(tà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));


@Override
public 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的監(jiān)聽第一個可見view的位置,直接將tablayout定位到相應的位置。

recyclerView.setOnTouchListener(new View.OnTouchListener() {
  @Override
  public boolean onTouch(View v, MotionEvent event) {
    //當滑動由recyclerView觸發(fā)時,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方法,執(zhí)行上一個判斷中的方法
    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);
    }
  }
});

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯行業(yè)資訊頻道,感謝您對創(chuàng)新互聯的支持。


本文標題:怎么在AndroidtabLayout中使用recyclerView實現錨點定位
本文URL:http://weahome.cn/article/jegjij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部