2017-09-01 15 views
0

どうすれば確認することができますかチェックRecyclerViewが上にスクロールされた場合(findFirstCompletelyVisibleItemPositionは動作しません)

説明:RecyclerView上のアイテムが大であり、時には「完全に表示」になることはありませんので、この方法は-1を返します(RecyclerView.NO_POSITION

をので、私は、この方法を使用するカント私は火にこのことを知っておく必要がありますリサイクラーの視点が最上部に到達したときのアクションです。あなたはRecyclerView.OnScrollListenerを作成し、それがスクロールしたどのくらいのトラックを保つことができる

timelineRecyclerView.addOnScrollListener(object:RecyclerView.OnScrollListener() { 
     override fun onScrollStateChanged(recyclerView:RecyclerView, 
           newState:Int) { 
      super.onScrollStateChanged(recyclerView, newState) 

     } 
     override fun onScrolled(recyclerView:RecyclerView, dx:Int, dy:Int) { 
      super.onScrolled(recyclerView, dx, dy) 

      currentTimelinePosition += dy 

      Log.wtf("position", currentTimelinePosition.toString()) 
      //if the timeline position is on its start, allow swipe and refresh 
      swipeLayout.isEnabled = currentTimelinePosition == 0 
     } 
    }) 
+0

「プルートゥーリフレッシュ」とタグ付けされていることにお気づきになりましたが、これは正確にはこれと関係がありますか?詳細を知っていれば、より良い解決策があるかもしれません。 –

+0

問題は、RecyclerViewがSwipeRefreshLayoutの内側にあることです。スワイプが誤った位置で更新されることがあります。 I.リストが上にないとき。だから私はRecyclerViewが上にあるときだけリフレッシュを許可します – cesarsicas

+0

ああ、私は参照してください。それは非常に奇妙なことですが、私は 'RecyclerView'でその問題はありませんが、おそらくそれは大きなアイテムです。 –

答えて

0

を助けるためにいくつかのコードを含める:解決

val manager = timelineRecyclerView?.layoutManager as StaggeredGridLayoutManager 
val visibles = manager.findFirstCompletelyVisibleItemPositions(null) 

たとえば、変数を保持し、それを垂直スクロール量に基づいてonScrollで更新するだけです。

class MyScrollListener() : RecyclerView.OnScrollListener() { 

    var currentScrollPosition = 0 

    override fun onScrolled(view: RecyclerView, dx: Int, dy: Int) { 
     currentScrollPosition += dy 

     if(currentScrollPosition == 0) { 
      // We're at the top 
     } 
    } 
} 
+0

ありがとうございました!私が適応しなければならなかったのは、RecyclerViewの項目が更新されたときに、「現在の位置」の値を0で再起動しなければならないということでした。 – cesarsicas

関連する問題