<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>オーバースクロール &#8211; FITSブログ</title>
	<atom:link href="http://blog.fits-inc.jp/tag/%e3%82%aa%e3%83%bc%e3%83%90%e3%83%bc%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fits-inc.jp</link>
	<description>Webシステムの受託開発でお困りなら</description>
	<lastBuildDate>Fri, 19 Jun 2020 10:42:30 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>http://blog.fits-inc.jp/wp-content/uploads/2024/06/cropped-image-5-32x32.png</url>
	<title>オーバースクロール &#8211; FITSブログ</title>
	<link>http://blog.fits-inc.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Android で RecylcerView のオーバースクロールを検知する</title>
		<link>http://blog.fits-inc.jp/2020/03/03/android-%e3%81%a7-recylcerview-%e3%81%ae%e3%82%aa%e3%83%bc%e3%83%90%e3%83%bc%e3%82%b9%e3%82%af%e3%83%ad%e3%83%bc%e3%83%ab%e3%82%92%e6%a4%9c%e7%9f%a5%e3%81%99%e3%82%8b/</link>
		
		<dc:creator><![CDATA[FITS Admin]]></dc:creator>
		<pubDate>Tue, 03 Mar 2020 08:29:29 +0000</pubDate>
				<category><![CDATA[技術ブログ]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[RecylcerView]]></category>
		<category><![CDATA[オーバースクロール]]></category>
		<guid isPermaLink="false">https://blog.fits-inc.jp/?p=348</guid>

					<description><![CDATA[　Android の RecyclerView でオーバースクロールを検知する方法をまとめました。リストの末端でのオーバースクロールで最新情報を取る、ツイッターのタイムラインスクロール時のような挙動に使えますよ。 よく見 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>　Android の RecyclerView でオーバースクロールを検知する方法をまとめました。リストの末端でのオーバースクロールで最新情報を取る、ツイッターのタイムラインスクロール時のような挙動に使えますよ。</p>



<h3 class="wp-block-heading">よく見るやり方（RecyclerView.addOnScrollListener）</h3>



<p>　「RecyclerView 下端 検知」などで検索するとよく見かけるのが addOnScrollListener でスクロールを検知し、さらに canScrollVertically により上端、下端へのスクロールが可能かを調べる、というものです。</p>



<pre class="wp-block-code"><code>recyclerView.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) {
  // 上端(top edge)のオーバースクロール検知
  if (!recyclerView.canScrollVertically(-1)) {
    ...
  }
  // 下端(bottom edge)のオーバースクロール検知
  if (!recyclerView.canScrollVertically(1)) {
    ...
  }
});</code></pre>



<p>　ただし、この方法だとそもそも RecyclerView の要素数が少ない場合や、要素が empty の場合には検知ができません（そもそもスクロールが発生しないとonScrolled が呼ばれないため）。また、オーバースクロールを検知して画面リロードなどが走ればよいのですが、ツイッターのように画面は遷移せずに動的に要素が増える、という場合は再スクロール時の判定が行えません（一度下端や上端に到達してしまうと、再度同じ方向にスクロールしても  onScrolled  が呼ばれないため）。</p>



<h3 class="wp-block-heading">onScrollStateChanged でどうにかできない？</h3>



<p>onScrollStateChanged の引数 newState には次のような値が入ってきます。</p>



<ul class="wp-block-list"><li> SCROLL_STATE_IDLE スクロールなし</li><li> SCROLL_STATE_DRAGGING 外部からのドラッグ操作が行われている（ユーザーのタッチ入力など）</li></ul>



<p>を判定することで、RecyclerView が empty だったとしてもスクロール動作が行われたかどうかを検知することは可能です。ただし、上端か下端か、という判定や、そもそもスクロール処理が onScrolled と onScrollStateChanged の二か所にまたがってしまうのは保守性を低下させます。</p>



<h3 class="wp-block-heading">ListView を継承したクラスなら onOverScrolled で検知可能 </h3>



<p>android.view.View が protected なメソッドとして onOverScroll を実装していますので、ListView を継承してこの onOverScroll をオーバーライドすればオーバースクロールが検知できます。しかし、RecyclerView では  onOverScroll  が呼ばれませんので、この方法は使用できません。</p>



<h3 class="wp-block-heading">LinerLayoutManager で検知する</h3>



<p>　LinerLayoutManager を scrollVerticallyBy 内で、スクロール可能量と実際のスクロール量からオーバースクロールを検知することもできます。</p>



<pre class="wp-block-code"><code>layoutManager = new LinearLayoutManager(getContext()) {
    @Override
    public int scrollVerticallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
        int scrollRange = super.scrollVerticallyBy(dx, recycler, state);
        int overScroll = dx - scrollRange;
        // 5 は検知するオーバースクロール量。適宜調整する
        if (overScroll > 5) {
            // bottom edge over scroll
        } else if (overScroll &lt; -5) {
            // top edge over scroll
        } else {
            // reset scroll state
        }
        return scrollRange;
    }
};
recyclerView.setLayoutManager(layoutManager);</code></pre>



<p>　ただしこの実装ではオーバースクロールが連続して検知されますので、採用する場合はオーバースクロール検知時に Handler.postDelayed などを利用して連続したオーバースクロールを無視したほうが良いです。</p>



<h3 class="wp-block-heading">仙台でAndroidのアプリ開発なら</h3>



<p>　仙台でAndroidのアプリ開発が可能なベンダーをお探しなら、是非 <a href="https://www.fits-inc.jp">FITS</a> までご相談ください。豊富な知識できっとお役に立てることと思います。エンジニアの採用も積極的に行っていますので、もし仙台で転職を考えている方がいれば<a href="https://www.fits-inc.jp/%E6%8E%A1%E7%94%A8%E6%83%85%E5%A0%B1/">こちら</a>から応募お待ちしています。（社長の年収を超えられるインセンティブ制度があります）</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
