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

Android RecyclerView 滾動到中間位置的方法示例

 更新時間:2018年03月19日 09:56:56   作者:huansky  
這篇文章主要介紹了Android RecyclerView 滾動到中間位置的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近看到QQ音樂的歌詞每次滑動后都可以滾回到中間位置。覺得甚是神奇,打開開發(fā)者模式顯示布局,發(fā)現歌詞部分不是采用 android 控件的寫的,應該是前端寫的。于是,我想,能不能用 recyclerView 實現這個自動回滾到中間位置呢。

功夫不負有心人,查找了一些資料之后,終于搞定了。

下面由我細細講來。

目標

點擊某個條目,在經過4s無任何操作之后,該條目滾動到中間位置顯示。點擊后,用戶在滑動,等用戶不操作后再開始延時。用戶多次點擊,記最后一次點擊位置。

分析

首先先考慮,滾動到指定位置是如何操作的?

// 滾動到指定位置
recyclerView.scrollToPosition(position);
// 平滑滾動到指定位置
recyclerView.smoothScrollToPosition(position);

有沒有滾動到制定像素位置呢?

// scrollBy(x, y)這個方法是自己去控制移動的距離,單位是像素,所以在使用scrollBy(x, y)需要自己去計算移動的高度或寬度。
recyclerView.scrollBy(x, y)

可是,問題是滾動到中間位置?。窟@個怎么辦呢?這樣子行不行呢?

mRecyclerView.scrollToPosition(0);
mRecyclerView.scrollBy(0,400);

先滾動到制定位置,在滾動一段距離不就好了?運行發(fā)現,這兩行代碼只執(zhí)行第一行,第二行無效。

debug 調試看了下,還是沒有弄懂,實現太復雜。

那就是說這樣是不行的,那有沒有其他辦法呢?

RecyclerView 有一個滾動監(jiān)聽方法:

mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
      }

      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
      }
    });

onScrollStateChanged 方法對應三種狀態(tài):靜止(SCROLL_STATE_IDLE),拖動滾動(SCROLL_STATE_DRAGGING),滑動(SCROLL_STATE_SETTLING)。

當手動緩慢滑動的時候,會觸發(fā): onScrollStateChanged (拖動滾動) --> (n個)onScrolled -->onScrollStateChanged(靜止);

當手快速滑動的時候,會觸發(fā): onScrollStateChanged (拖動滾動) --> (n個)onScrolled --> onScrollStateChanged (滑動) -->

(n個)onScrolled --> onScrollStateChanged (靜止);

有想法了,點擊的時候,先運行 scrollToPosition,在 onScrolled 方法里面 運行 scrollBy 方法。寫代碼,運行,通過。

下面就是中間位置的計算了。

首先計算出 recylerview 的展現高度。

 Rect rect = new Rect();
 mRecyclerView.getGlobalVisibleRect(rect);
 reHeight = rect.bottom - rect.top - vHeight;
當運行 scrollToPosition 后,點擊條目就會出現在視野當中,這時候,計算出相應的位移即可。需要注意一點的是,當點擊條目在視野內的時候,是不會運行 scrollToPosition 方法的。

    int top = mRecyclerView.getChildAt(position - firstPosition).getTop();
int half = reHeight / 2;
    mRecyclerView.scrollBy(0, top - half);

最后就是延時的設定,采用Handler 進行延時。

代碼

核心代碼如下:

public class MainActivity extends AppCompatActivity {
  private static final String TAG = "MainActivity";
  private RecyclerView mRecyclerView;
  private LinearLayoutManager mLayoutManager;
  private RecyclerView.Adapter mAdapter;
  private String[] data;
  private Handler handler;
  private boolean isClick = false;
  private static int vHeight = -1;
  private static int reHeight = -1;
  private static int position = 0;
  private static final int target = 10;
  private static boolean isMove = false;
  private Runnable runnable;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    handler = new Handler();

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    //創(chuàng)建默認的線性LayoutManager
    mLayoutManager = new LinearLayoutManager(this);
    mLayoutManager.setAutoMeasureEnabled(true);
    mRecyclerView.setLayoutManager(mLayoutManager);
    //如果可以確定每個item的高度是固定的,設置這個選項可以提高性能
    mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setNestedScrollingEnabled(false);
    data = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21"};


    runnable = new Runnable() {
      @Override
      public void run() {
        if (isVisible()) {
          scrollToMiddle();
        } else {
          mRecyclerView.scrollToPosition(position);
          isMove = true;
          isClick = false;
        }
      }
    };

    mAdapter = new MyAdapter(data, new MyAdapter.onRecyclerViewItemClick() {
      @Override
      public void onItemClick(View v, int pos) {
        Toast.makeText(MainActivity.this, "第" + pos + "行", Toast.LENGTH_SHORT).show();
        position = pos;
        vHeight = v.getHeight();

        Rect rect = new Rect();
        mRecyclerView.getGlobalVisibleRect(rect);
        reHeight = rect.bottom - rect.top - vHeight;

        // handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);
        handler.postDelayed(runnable, 4000);
        isClick = true;

      }
    });
    mRecyclerView.setAdapter(mAdapter);
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        Log.d(TAG, "" + newState);
        if (newState == RecyclerView.SCROLL_STATE_DRAGGING && !isMove) {
          handler.removeCallbacks(runnable);
        }
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
          if (isClick) {
            handler.postDelayed(runnable, 4000);
          }
        }
      }

      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        if (isMove) {
          if (vHeight < 0) {
            isMove = false;
            return;
          }
          scrollToMiddle();
        }
      }
    });
public void scrollToMiddle() {
    final int firstPosition = mLayoutManager.findFirstVisibleItemPosition();
    int top = mRecyclerView.getChildAt(position - firstPosition).getTop();
    Log.d(TAG, " position" + position + " " + top);
    int half = reHeight / 2;
    mRecyclerView.scrollBy(0, top - half);
    isMove = false;

  }

  public boolean isVisible() {
    final int firstPosition = mLayoutManager.findFirstVisibleItemPosition();
    final int lastPosition = mLayoutManager.findLastVisibleItemPosition();
    return position <= lastPosition && position >= firstPosition;
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    handler.removeCallbacksAndMessages(null);
    handler = null;
  }
}

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

相關文章

  • Android實現淘寶商品列表切換效果

    Android實現淘寶商品列表切換效果

    這篇文章主要為大家詳細介紹了Android實現淘寶商品列表切換效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Flutter BuildContext功能使用詳解

    Flutter BuildContext功能使用詳解

    這篇文章主要為大家介紹了Flutter BuildContext功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Android中分析Jetpack?Compose動畫內部的實現原理

    Android中分析Jetpack?Compose動畫內部的實現原理

    這篇文章主要介紹了Android中分析Jetpack?Compose動畫內部的實現原理,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-09-09
  • Android 仿蘋果IOS6開關按鈕

    Android 仿蘋果IOS6開關按鈕

    這篇文章主要介紹了Android 仿蘋果IOS6開關按鈕的實現代碼,代碼簡單易懂非常不錯具有參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • 詳解Android JNI的基本使用(CMake)

    詳解Android JNI的基本使用(CMake)

    本文介紹了Android JNI的基本使用(CMake),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Android開源項目PullToRefresh下拉刷新功能詳解2

    Android開源項目PullToRefresh下拉刷新功能詳解2

    這篇文章主要為大家進一步的介紹了Android開源項目PullToRefresh下拉刷新功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android解析Intent Filter的方法

    Android解析Intent Filter的方法

    這篇文章主要介紹了Android解析Intent Filter的方法,較為詳細的分析了Intent解析的原理與相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • Android Popupwindow彈出窗口的簡單使用方法

    Android Popupwindow彈出窗口的簡單使用方法

    這篇文章主要為大家詳細介紹了Android Popupwindow彈出窗口的簡單使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android實現下拉菜單Spinner效果

    Android實現下拉菜單Spinner效果

    這篇文章主要介紹了Android實現下拉菜單Spinner效果,學習Spinner組件的使用方法,非常好用的一款組件,相當于從下拉列表中選擇項目,感興趣的小伙伴們可以參考一下
    2016-04-04
  • Android中App字體大小不隨系統(tǒng)改變而改變

    Android中App字體大小不隨系統(tǒng)改變而改變

    這篇文章主要介紹了Android中App字體大小不隨系統(tǒng)改變而改變,需要的朋友可以參考下
    2017-04-04

最新評論