欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android使用RecyclerView實(shí)現(xiàn)水平滾動(dòng)控件

 更新時(shí)間:2016年09月08日 08:47:54   投稿:daisy  
這篇文章給大家介紹了利用Android使用RecyclerView實(shí)現(xiàn)水平滾動(dòng)的效果,本文做了一個(gè)年齡滾動(dòng)控件的例子,對(duì)大家開發(fā)Android具有一定參考借鑒價(jià)值,有需要的可以參考借鑒。

前言

相信大家都知道Android滾動(dòng)控件的實(shí)現(xiàn)方式有很多, 使用RecyclerView也比較簡單. 做了一個(gè)簡單的年齡滾動(dòng)控件, 讓我們來看看RecyclerView的使用方式, 主要有以下幾點(diǎn):

     (1) 對(duì)齊控件中心位置.

     (2) 計(jì)算滾動(dòng)距離.

     (3) 高亮中心視圖.

     (4) 實(shí)時(shí)顯示中心數(shù)據(jù).

     (5) 停止時(shí)自動(dòng)對(duì)齊.

     (6) 滾動(dòng)時(shí), 設(shè)置按鈕狀態(tài)開關(guān).

效果

1. 框架

主要關(guān)注RecyclerView部分邏輯.

 /**
  * 初始化年齡滑動(dòng)條
  */
 private void initAgeList() {
  LinearLayoutManager mLayoutManager =
    new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
  mRvAgeList.setLayoutManager(mLayoutManager);
  mAgeAdapter = new PersonAgeAdapter(START_NUM, END_NUM);
  mRvAgeList.setAdapter(mAgeAdapter);
  mRvAgeList.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);

    mBDownStep.setEnabled(false);

    // 效果在暫停時(shí)顯示, 否則會(huì)導(dǎo)致重繪異常
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
     mAgeAdapter.highlightItem(getMiddlePosition());
     mRvAgeList.scrollToPosition(getScrollPosition());
     mLastValue = getMiddlePosition();
     UserInfoManager.setAge(getMiddlePosition() + START_NUM);

     mBDownStep.setEnabled(true); // 滑動(dòng)時(shí)不可用, 停止時(shí)才可以
    }
   }

   @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    // 值是實(shí)時(shí)增加
    mTvAgeValue.setText(String.valueOf(getMiddlePosition() + START_NUM));
   }
  });

  mAgeAdapter.highlightItem(getMiddlePosition());
 }

設(shè)置一個(gè)水平布局

LinearLayoutManager mLayoutManager =
    new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
  mRvAgeList.setLayoutManager(mLayoutManager);

添加Adapter, 設(shè)置起始和結(jié)束位置.

  mAgeAdapter = new PersonAgeAdapter(START_NUM, END_NUM);
  mRvAgeList.setAdapter(mAgeAdapter);

2. Adapter

Adapter定制一些功能, 如標(biāo)示指向中心位置, 數(shù)據(jù)聯(lián)動(dòng)顯示, 高亮Item等.

/**
 * 年齡的適配器
 * <p>
 * Created by wangchenlong on 15/11/12.
 */
public class PersonAgeAdapter extends RecyclerView.Adapter<PersonAgeAdapter.AgeItemViewHolder> {

 public static final int ITEM_NUM = 7; // 每行擁有的Item數(shù), 必須是奇數(shù)

 private int mFrom; // 起始
 private int mTo; // 終止
 private int mHighlight = -1; // 高亮

 public PersonAgeAdapter(int from, int to) {
  mFrom = from;
  mTo = to;
 }

 @Override public AgeItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View item = LayoutInflater.from(parent.getContext()).
    inflate(R.layout.view_age_item, parent, false);

  // 設(shè)置Item的寬度
  ViewGroup.LayoutParams lp = item.getLayoutParams();
  lp.width = getItemStdWidth();

  return new AgeItemViewHolder(item);
 }

 @Override public void onBindViewHolder(AgeItemViewHolder holder, int position) {
  holder.getTextView().setText(String.valueOf(mFrom + position));

  // 高亮顯示
  if (isSelected(position)) {
   holder.getTextView().setTextSize(30);
   holder.getTextView().setTextColor(ChunyuApp.getAppContext().getResources().getColor(R.color.black));
  } else {
   holder.getTextView().setTextSize(20);
   holder.getTextView().setTextColor(ChunyuApp.getAppContext().getResources().getColor(R.color.gray_line));
  }
 }

 // 高亮中心, 更新前后位置
 public void highlightItem(int position) {
  mHighlight = position;
  int offset = ITEM_NUM / 2;
  for (int i = position - offset; i <= position + offset; ++i)
   notifyItemChanged(i);
 }

 // 判斷是否是高亮
 public boolean isSelected(int position) {
  return mHighlight == position;
 }


 @Override public int getItemCount() {
  return mTo - mFrom + 1;
 }

 // 獲取標(biāo)準(zhǔn)寬度
 public static int getItemStdWidth() {
  DisplayMetrics displayMetrics = ChunyuApp.getAppContext().getResources().getDisplayMetrics();
  return displayMetrics.widthPixels / ITEM_NUM;
 }

 // ViewHolder
 public class AgeItemViewHolder extends RecyclerView.ViewHolder {

  private TextView mTextView;

  public AgeItemViewHolder(View itemView) {
   super(itemView);

   mTextView = (TextView) itemView.findViewById(R.id.item_age_value);
   mTextView.setTag(this);
  }

  public TextView getTextView() {
   return mTextView;
  }
 }
}

每個(gè)單元格寬度是屏幕寬度的奇數(shù)分之一, 填充屏幕, 則起始指向中心.

 @Override public AgeItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  View item = LayoutInflater.from(parent.getContext()).
    inflate(R.layout.view_age_item, parent, false);

  // 設(shè)置Item的寬度
  ViewGroup.LayoutParams lp = item.getLayoutParams();
  lp.width = getItemStdWidth();

  return new AgeItemViewHolder(item);
 }

單數(shù)Item數(shù)量, 則中心的指示器必指向中心Item的中心.

根據(jù)選中狀態(tài), 更新Item樣式.

 @Override public void onBindViewHolder(AgeItemViewHolder holder, int position) {
  holder.getTextView().setText(String.valueOf(mFrom + position));

  // 高亮顯示
  if (isSelected(position)) {
   holder.getTextView().setTextSize(30);
   holder.getTextView().setTextColor(ChunyuApp.getAppContext().getResources().getColor(R.color.black));
  } else {
   holder.getTextView().setTextSize(20);
   holder.getTextView().setTextColor(ChunyuApp.getAppContext().getResources().getColor(R.color.gray_line));
  }
 }

設(shè)置高亮, 把中心位置高亮, 兩邊恢復(fù), 通知Adapter重繪ViewHolder.

 // 高亮中心, 更新前后位置
 public void highlightItem(int position) {
  mHighlight = position;
  int offset = ITEM_NUM / 2;
  for (int i = position - offset; i <= position + offset; ++i)
   notifyItemChanged(i);
 }

 // 判斷是否是高亮
 public boolean isSelected(int position) {
  return mHighlight == position;
 }
notifyItemChanged()會(huì)重繪所選擇的頁面.

獲取寬度, 把一行顯示Item數(shù)量設(shè)置為單數(shù), 則中心指向一個(gè)Item.

 // 獲取標(biāo)準(zhǔn)寬度
 public static int getItemStdWidth() {
  DisplayMetrics displayMetrics = ChunyuApp.getAppContext().getResources().getDisplayMetrics();
  return displayMetrics.widthPixels / ITEM_NUM;
 }

注意RecyclerView不能移動(dòng)半個(gè)單元, 每行數(shù)量是單數(shù)時(shí), 則必會(huì)指向中心.

3. 滾動(dòng)邏輯

在滾動(dòng)時(shí), 實(shí)時(shí)更新頁面顯示; 在停止時(shí), 更新高亮和存儲(chǔ)數(shù)據(jù); 滾動(dòng)結(jié)束時(shí), 激活按鈕.

  mRvAgeList.addOnScrollListener(new RecyclerView.OnScrollListener() {
   @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    mBDownStep.setEnabled(false);

    // 效果在暫停時(shí)顯示, 否則會(huì)導(dǎo)致重繪異常
    if (newState == RecyclerView.SCROLL_STATE_IDLE) {
     mAgeAdapter.highlightItem(getMiddlePosition());
     mRvAgeList.scrollToPosition(getScrollPosition());
     mLastValue = getMiddlePosition();
     UserInfoManager.setAge(getMiddlePosition() + START_NUM);

     mBDownStep.setEnabled(true); // 滑動(dòng)時(shí)不可用, 停止時(shí)才可以
    }
   }

   @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    // 值是實(shí)時(shí)增加
    mTvAgeValue.setText(String.valueOf(getMiddlePosition() + START_NUM));
   }
  });

  mAgeAdapter.highlightItem(getMiddlePosition());
 }

 /**
  * 獲取中間位置
  *
  * @return 當(dāng)前值
  */
 private int getMiddlePosition() {
  return getScrollPosition() + (PersonAgeAdapter.ITEM_NUM / 2);
 }

 /**
  * 獲取滑動(dòng)值, 滑動(dòng)偏移 / 每個(gè)格子寬度
  *
  * @return 當(dāng)前值
  */
 private int getScrollPosition() {
  return (int) ((double) mRvAgeList.computeHorizontalScrollOffset()
    / (double) PersonAgeAdapter.getItemStdWidth());
 }

判斷滾動(dòng)的距離單位, 偏移總距離/單個(gè)Item寬度.

 private int getScrollPosition() {
  return (int) ((double) mRvAgeList.computeHorizontalScrollOffset()
    / (double) PersonAgeAdapter.getItemStdWidth());
 }

computeHorizontalScrollOffset()獲取RecyclerView的偏移總位移.

中間位置, 還要加上半行Item數(shù)量

 private int getMiddlePosition() {
  return getScrollPosition() + (PersonAgeAdapter.ITEM_NUM / 2);
 }

判斷滾動(dòng)是否停止.

if (newState == RecyclerView.SCROLL_STATE_IDLE)

在滾動(dòng)停止時(shí), 自動(dòng)對(duì)齊.

mRvAgeList.scrollToPosition(getScrollPosition());

調(diào)用需要高亮顯示的Item.

mAgeAdapter.highlightItem(getMiddlePosition());

注意在滾動(dòng)停止時(shí), 更新高亮比較好, 否則重繪速度較慢, 會(huì)影響滾動(dòng)效果.

滑動(dòng)效果

總結(jié)

好了,以上就是這篇文章的全部內(nèi)容了,我們可以根據(jù)這些定制各式各樣的滾動(dòng)條了!希望這篇文章對(duì)大家能有所幫助。

相關(guān)文章

  • Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果

    Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果

    在android開發(fā),我們會(huì)常常使用到縮放動(dòng)畫,這篇文章主要給大家介紹了關(guān)于Android列表實(shí)現(xiàn)單選點(diǎn)擊縮放動(dòng)畫效果的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Android編寫簡單的網(wǎng)絡(luò)爬蟲

    Android編寫簡單的網(wǎng)絡(luò)爬蟲

    網(wǎng)絡(luò)爬蟲是捜索引擎抓取系統(tǒng)的重要組成部分。爬蟲的主要目的是將互聯(lián)網(wǎng)上的網(wǎng)頁下載到本地形成一個(gè)或聯(lián)網(wǎng)內(nèi)容的鏡像備份。本文的主要內(nèi)容是講在Android中如何編寫簡單的網(wǎng)絡(luò)爬蟲。
    2016-07-07
  • Android仿微信實(shí)現(xiàn)評(píng)論功能

    Android仿微信實(shí)現(xiàn)評(píng)論功能

    這篇文章主要為大家詳細(xì)介紹了Android仿微信實(shí)現(xiàn)評(píng)論功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android中刪除sdcard里文件的命令

    Android中刪除sdcard里文件的命令

    這篇文章主要介紹了Android中刪除sdcard里文件的命令,本文講解了刪除android模擬器或手機(jī)上的sd卡文件的方法,需要的朋友可以參考下
    2015-04-04
  • Android 開發(fā)實(shí)現(xiàn)EditText 光標(biāo)居右顯示

    Android 開發(fā)實(shí)現(xiàn)EditText 光標(biāo)居右顯示

    這篇文章主要介紹了Android 開發(fā)實(shí)現(xiàn)EditText 光標(biāo)居右顯示的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 基于Android"今日事今日畢"的使用介紹

    基于Android"今日事今日畢"的使用介紹

    本篇文章是對(duì)Android"今日事今日畢"的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • android 仿QQ動(dòng)態(tài)背景、視頻背景的示例代碼

    android 仿QQ動(dòng)態(tài)背景、視頻背景的示例代碼

    本篇文章主要介紹了android 仿QQ動(dòng)態(tài)背景、視頻背景的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • 違章查詢?cè)创a分享

    違章查詢?cè)创a分享

    本文主要分享了違章查詢?cè)创a,特附上源碼下載地址和測(cè)試安裝包下載地址。需要的朋友一起來看下吧
    2016-12-12
  • Android ProductFlavor的使用詳解

    Android ProductFlavor的使用詳解

    如果你的項(xiàng)目需要要區(qū)分國內(nèi)版和國外版甚至還要根據(jù)用戶是否是VIP會(huì)員加上收費(fèi)和免費(fèi)的版本,我們可以使用ProductFlavor對(duì)UI布局和icon圖標(biāo)進(jìn)行版本區(qū)分,有此類需求的朋友,不妨了解下本文
    2021-06-06
  • Android中TextView實(shí)現(xiàn)部分文字可點(diǎn)擊跳轉(zhuǎn)

    Android中TextView實(shí)現(xiàn)部分文字可點(diǎn)擊跳轉(zhuǎn)

    這篇文章主要為大家詳細(xì)介紹了Android中TextView實(shí)現(xiàn)部分文字可點(diǎn)擊跳轉(zhuǎn)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論