-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
43 lines (30 loc) · 8.37 KB
/
atom.xml
File metadata and controls
43 lines (30 loc) · 8.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>林韬的博客随笔</title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2017-03-08T12:59:15.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>林韬</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Android使用LayoutManager的findFirstCompletelyVisibleItemPosition和findLastCompletelyVisibleItemPosition判断下拉刷新上拉加载问题</title>
<link href="http://yoursite.com/2017/03/08/Android%E4%BD%BF%E7%94%A8LinearLayoutManager%E7%9A%84findFirstCompletelyVisibleItemPosition%E5%92%8CfindLastCompletelyVisibleItemPosition%E5%88%A4%E6%96%AD%E4%B8%8B%E6%8B%89%E5%88%B7%E6%96%B0%E4%B8%8A%E6%8B%89%E5%8A%A0%E8%BD%BD%E9%97%AE%E9%A2%98/"/>
<id>http://yoursite.com/2017/03/08/Android使用LinearLayoutManager的findFirstCompletelyVisibleItemPosition和findLastCompletelyVisibleItemPosition判断下拉刷新上拉加载问题/</id>
<published>2017-03-07T16:48:39.000Z</published>
<updated>2017-03-08T12:59:15.000Z</updated>
<content type="html"><![CDATA[<p>Android现在的上拉刷新、下拉加载很多都是使用<code>SwipeRefreshLayout</code>和<code>RecyclerView</code>,监听滑动实现的,在监听滑动时通过标题的两个方法判断是否滑动到底以及是否滑动到头,关于这个网上博客很多,就不介绍了。</p>
<p>一般情况下确实是没有问题的,但是如果你的<strong><em>第一个Item/最后一个Item</em></strong>的<code>View</code>大小超过屏幕大小,你就会发现<strong><em>下拉刷新/上拉加载</em></strong>失去作用。那这是什么问题呢?</p>
<p>首先,我们来看下<code>findFirstCompletelyVisibleItemPosition()</code><br><figure class="highlight aspectj"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">int</span> <span class="title">findLastCompletelyVisibleItemPosition</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">final</span> View child = findOneVisibleChild(getChildCount() - <span class="number">1</span>, <span class="number">-1</span>, <span class="keyword">true</span>, <span class="keyword">false</span>);</div><div class="line"> <span class="keyword">return</span> child == <span class="keyword">null</span> ? NO_POSITION : getPosition(child);</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>我们看到它是通过<code>findOneVisibleChild()</code>方法来获得View的<br><img src="/2017/03/08/Android使用LinearLayoutManager的findFirstCompletelyVisibleItemPosition和findLastCompletelyVisibleItemPosition判断下拉刷新上拉加载问题/findOne.png" alt="findOneVisibleChild" title="findOneVisibleChild"><br>可以发现通过<code>findFirstCompletelyVisibleItemPosition()</code>和<code>findLastCompletelyVisibleItemPosition()</code>实现上拉加载下拉刷新并不是很合适,这两个方法如其名,返回的是完全显示的item位置,而不是我们需要的最后一个且底部完全显示的item位置。知道了这个解决方法就简单了。我们只需要修改<code>LinearLayoutManager</code>添加几个方法就好了。</p>
<p>修改的代码如下</p>
<figure class="highlight aspectj"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">int</span> <span class="title">findFirstTopCompletelyEmergedItemPosition</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">final</span> View child = findOneBorderCompleteVisibleChild(getChildCount() - <span class="number">1</span>, <span class="number">-1</span>, <span class="keyword">false</span>);</div><div class="line"> <span class="keyword">return</span> child == <span class="keyword">null</span> ? <span class="number">-1</span> : getPosition(child);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">int</span> <span class="title">findLastBottomCompletelyEmergedItemPosition</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">final</span> View child = findOneBorderCompleteVisibleChild(<span class="number">0</span>, getChildCount(), <span class="keyword">true</span>);</div><div class="line"> <span class="keyword">return</span> child == <span class="keyword">null</span> ? <span class="number">-1</span> : getPosition(child);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="keyword">private</span> <span class="function">View <span class="title">findOneBorderCompleteVisibleChild</span><span class="params">(<span class="keyword">int</span> fromIndex, <span class="keyword">int</span> toIndex, <span class="keyword">boolean</span> requestTop)</span> </span>{</div><div class="line"> <span class="keyword">final</span> <span class="keyword">int</span> start = getStartAfterPadding();</div><div class="line"> <span class="keyword">final</span> <span class="keyword">int</span> end = getEndAfterPadding();</div><div class="line"> <span class="keyword">final</span> <span class="keyword">int</span> next = toIndex > fromIndex ? <span class="number">1</span> : -1;</div><div class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = fromIndex; i != toIndex; i+=next) {</div><div class="line"> <span class="keyword">final</span> View child = getChildAt(i);</div><div class="line"> <span class="keyword">final</span> <span class="keyword">int</span> childStart = getDecoratedStart(child);</div><div class="line"> <span class="keyword">final</span> <span class="keyword">int</span> childEnd = getDecoratedEnd(child);</div><div class="line"> <span class="keyword">if</span> (childStart < end && childEnd > start) {</div><div class="line"> <span class="keyword">if</span> (requestTop) {</div><div class="line"> <span class="keyword">if</span> (childStart >= start) {</div><div class="line"> <span class="keyword">return</span> child;</div><div class="line"> }</div><div class="line"> } <span class="function"><span class="keyword">else</span> <span class="title">if</span> <span class="params">(childEnd <= end)</span> </span>{</div><div class="line"> <span class="keyword">return</span> child;</div><div class="line"> }</div><div class="line"> } </div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>当然我这只是是针对<code>LinearLayoutManger</code>,<code>gravity</code>是竖直的情况进行讨论的,其他情况也可以用类似解决方法。</p>
]]></content>
<summary type="html">
<p>Android现在的上拉刷新、下拉加载很多都是使用<code>SwipeRefreshLayout</code>和<code>RecyclerView</code>,监听滑动实现的,在监听滑动时通过标题的两个方法判断是否滑动到底以及是否滑动到头,关于这个网上博客很多,就不介
</summary>
</entry>
</feed>