Android RecyclerView 滚动到中间位置的方法示例

Android RecyclerView 滚动到中间位置的方法示例,第1张

概述最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置。觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用android控件的写的,应该是前端写的。于是,我想,能不能用recyclerView实现这个自动回滚到中间位

最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置。觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 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);

先滚动到制定位置,在滚动一段距离不就好了?运行发现,这两行代码只执行第一行,第二行无效。

deBUG 调试看了下,还是没有弄懂,实现太复杂。

那就是说这样是不行的,那有没有其他办法呢?

RecyclerVIEw 有一个滚动监听方法:

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 方法对应三种状态:静止(SCRolL_STATE_IDLE),拖动滚动(SCRolL_STATE_DRAGGING),滑动(SCRolL_STATE_SETTliNG)。

当手动缓慢滑动的时候,会触发: onScrollStateChanged (拖动滚动) --> (n个)onScrolled -->onScrollStateChanged(静止);

当手快速滑动的时候,会触发: 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);    //创建默认的线性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,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,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 RecyclerView UI的滚动控件示例Android RecyclerView 实现快速滚动的示例代码功能强大的Android滚动控件RecyclerViewAndroid使用Recyclerview实现图片水平自动循环滚动效果Android_RecyclerView实现上下滚动广告条实例(带图片)Android中RecyclerView实现分页滚动的方法详解Android RecyclerView滚动定位Android使用RecyclerView实现水平滚动控件Android代码实现AdapterViews和RecyclerView无限滚动 总结

以上是内存溢出为你收集整理的Android RecyclerView 滚动到中间位置的方法示例全部内容,希望文章能够帮你解决Android RecyclerView 滚动到中间位置的方法示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1142927.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存