结对编程的第1例:主要着眼于,解决RecyclerView的头部伸缩时,抖动的功能

来源:互联网 发布:漫威电影观看顺序知乎 编辑:程序博客网 时间:2024/06/01 09:41

1.工具。人员。会议室准备。

2.先展示一遍代码,整个需求流程讲解一下。

目前做了哪些
想要什么样的效果
遇到了什么样的问题

3.发哥揭示出了问题的原理(从另一个观察的角度)

发哥联想到了近来玩的一个桌球APP

然后展示了可能出现问题的手指按住后抬起,导致的焦点偏移情况

4.那么问题的关键就出来了,既然是自动滑动与手指按住的冲突,那么在自动滑时,禁止RecyclerView对手指作出相应就好

5.尝试把RecyclerView在特定时段,设置为禁止滚动(滑动)

1.尝试了 recycler.setNestedScrollEnable(false) 方法
————>没有效果

2.尝试了

LinearLayoutManager linearLayoutManager = new LinearLayoutManager( getActivity(),      LinearLayoutManager.VERTICAL, false) {       @Override      public boolean canScrollVertically() {            return false;    }}recyclerview.setLayoutManager(linearLayoutManager);  

————>没有效果

3.尝试了

void setLayoutFrozen (boolean frozen)
recyclerview.setLayoutManager(true)  //实现冻结。

——————>这一方法,实现了RecyclerView的禁止手指触控响应功能。手指无法对RecyclerView进行操作。(但是:这一方法,需要配合 #6 点,才能完美实现功能。)

6.在setLayoutFrozen 冻结Recycler之前,要先停止Recycler的滚动(滑动)

不然会报异常:
"Do not setLayoutFrozen in layout or scroll"·

原因是在于:设置 冻结 方法的同时,Recycler仍处在滚动的状态。 setLayoutFrozen的内部,会自行先检测,是否处于 layout方法 或 scroll方法 的状态下。如果是,则会抛出异常。

解决方法:

    //强制停止RecyclerView滑动方法      public static void forceStopRecyclerViewScroll(RecyclerView mRecyclerView) {               mRecyclerView.dispatchTouchEvent(                         MotionEvent.obtain(SystemClock.uptimeMillis(),                           SystemClock.uptimeMillis(),                          MotionEvent.ACTION_CANCEL, 0, 0, 0));      }  

操作步骤:直接在要停止Recycler滚动的地方(比如recyclerview.setLayoutManager(true)之前),塞入这句。则可以实现先停止滚动,然后冻结Recycler。

7.继续,要美化一下Recycler向上滑到,头部缩回去后,有一部分文字内容,仍没有完全显示出来,需要再手动往上滑一点点以显示,的这个问题

很简单的采用网上的两个方法:

recycler.smoothScrollToPosition( 0 )

以及

recycler.scrollToPosition( 0 )

两者的区别,在于 smoothScroll ,会平滑的滚动过去;
而scroll,则会直接滚动到指定位置。

实际使用中:
scroll使用,很完美。完美达到需求。
smoothScroll,会触发 frozen冻结的 "Do not setLayoutFrozen in layout or scroll"· 问题。暂时还不知道如何解决。

于是,决定先采用 scroll,效果也确实满足了要求。

原创粉丝点击