自從android5.0推出RecyclerView之後,RecyclerView愈來愈受廣大程序員的熱愛了!你們都知道RecyclerView的出現目的是爲了替代listview和ScrollView在列表方面的使用!那麼listview和ScrollView的全部功能和方法都應該有的!java
可是RecyclerView的不少方法,不是封裝在RecyclerView中的,當咱們在RecyclerView中找不到對應的方法時,就應該想到他的管理類manager了!
大多方法都封裝在此啊!android
最近有個同窗用到了RecyclerView跳轉到指定位置的需求,其實很簡單,在這裏我就給出個人作法,有指教的和改進的歡迎提出,須要用的就用,勿噴哈…..程序員
方法一,直接使用當前的manageride
/** * RecyclerView 移動到當前位置, * * @param manager 設置RecyclerView對應的manager * @param n 要跳轉的位置 */ public static void MoveToPosition(LinearLayoutManager manager, int n) { manager.scrollToPositionWithOffset(n, 0); manager.setStackFromEnd(true); }
方法2、根據當前RecyclerView的條目數量,這個相對複雜一些,可是能夠有效地避免指針越界呦..spa
/** * RecyclerView 移動到當前位置, * * @param manager 設置RecyclerView對應的manager * @param mRecyclerView 當前的RecyclerView * @param n 要跳轉的位置 */ public static void MoveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int n) { int firstItem = manager.findFirstVisibleItemPosition(); int lastItem = manager.findLastVisibleItemPosition(); if (n <= firstItem) { mRecyclerView.scrollToPosition(n); } else if (n <= lastItem) { int top = mRecyclerView.getChildAt(n - firstItem).getTop(); mRecyclerView.scrollBy(0, top); } else { mRecyclerView.scrollToPosition(n); } }
/** * 目標項是否在最後一個可見項以後 */ private boolean mShouldScroll; /** * 記錄目標項位置 */ private int mToPosition; /** * 滑動到指定位置 * * @param mRecyclerView * @param position */ private void smoothMoveToPosition(RecyclerView mRecyclerView, final int position) { // 第一個可見位置 int firstItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(0)); // 最後一個可見位置 int lastItem = mRecyclerView.getChildLayoutPosition(mRecyclerView.getChildAt(mRecyclerView.getChildCount() - 1)); if (position < firstItem) { // 若是跳轉位置在第一個可見位置以前,就smoothScrollToPosition能夠直接跳轉 mRecyclerView.smoothScrollToPosition(position); } else if (position <= lastItem) { // 跳轉位置在第一個可見項以後,最後一個可見項以前 // smoothScrollToPosition根本不會動,此時調用smoothScrollBy來滑動到指定位置 int movePosition = position - firstItem; if (movePosition >= 0 && movePosition < mRecyclerView.getChildCount()) { int top = mRecyclerView.getChildAt(movePosition).getTop(); mRecyclerView.smoothScrollBy(0, top); } } else { // 若是要跳轉的位置在最後可見項以後,則先調用smoothScrollToPosition將要跳轉的位置滾動到可見位置 // 再經過onScrollStateChanged控制再次調用smoothMoveToPosition,執行上一個判斷中的方法 mRecyclerView.smoothScrollToPosition(position); mToPosition = position; mShouldScroll = true; } }
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (mShouldScroll) { mShouldScroll = false; smoothMoveToPosition(mRecyclerView, mToPosition); } } });
if (TextUtils.equals(mCarBrandList.get(i).pinyin.charAt(0) + "", letter)) { if (i == 0) { // UIUtils.MoveToPosition(manager, mRecyclerView, i); smoothMoveToPosition(mRecyclerView,i); } else { smoothMoveToPosition(mRecyclerView,i+1); // UIUtils.MoveToPosition(manager, mRecyclerView, i + 1); } break; }
好了這樣就能夠了,不信你試試…….指針