2016-08-19 17 views
1

ViewHolder内のビューがウィンドウ境界の外に移動したとき(スクロールオフまたは部分的にスクロールされたとき)オフ)?RecyclerView.ViewHolderの内部でビューが部分的に検出される

RecyclerViewにスクロールリスナーを設定し、findFirstCompletelyVisibleItemPosition()などについてLayoutManagerを確認し、どのビューが見えなくなったかを調べることをお勧めします。ような何か:

private RecyclerView.OnScrollListener mScrollListener = new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     calculateVisibility(); 
    } 
}; 
calculateVisibility()は、すべてのスクロールイベントで実行されます

が、これは私だけの私ViewHolder位置ではなく、実際のViewHoldersまたはそれらのビューの保有者内部の個々のビューの可視性を提供します。つまり、レイアウトマネージャーから実際のレイアウトのレイアウトを検索してから、ビューホルダー内の個々のビューを測定する必要があります。次のようなものがあります。

private void calculateVisibility() { 
    if (!isAdded() || !getUserVisibleHint() || mAdapter == null) { 
     return; 
    } 

    if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == -1 
      && mLayoutManager.findLastCompletelyVisibleItemPosition() == -1 
      && mLayoutManager.findFirstVisibleItemPosition() == -1 
      && mLayoutManager.findLastVisibleItemPosition() == -1) { 
     return; 
    } 
    int firstPartiallyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition(); 
    int lastPartiallyVisiblePosition = mLayoutManager.findFirstCompletelyVisibleItemPosition(); 

    View v = mLayoutManager.findViewByPosition(firstPartiallyVisiblePosition); 
    for (v instanceof MySpecialView) { 
     boolean visible = isViewVisible(v); 
     // do stuff based on visibility 
    } 
} 

これは非常に非効率的なようです。

方法アダプター内部がリサイクルと取り外しに関連しているように見えますが、単に画面の表示をスクロールするだけでは起こりません。

誰かが似たようなことをしたことがありますか?

+0

これをやりたいと思っためのあなたの理由は何ですか? –

+0

私はRecyclerView内でExoPlayerの動画を再生しています。 ViewHolder内には複数の動画が存在することがあります。少なくとも1つが画面からスクロールすると、プレイヤーを停止してリソースを解放する必要があります。 – vkislicins

+0

おそらく 'View.getVisibility()'がより効率的です。これがあなたのユースケースを完全に満たすかどうかはわかりません。 –

答えて

1

これは誰にとって有用である場合には、これは私がやってしまったものです:

private void calculateVisibility() { 
    if (!isAdded() || !getUserVisibleHint() || mAdapter == null 
      || mAdapter.getItemCount() == 0) { 
     return; 
    } 

    if (mLayoutManager.findFirstCompletelyVisibleItemPosition() == -1 
      && mLayoutManager.findLastCompletelyVisibleItemPosition() == -1 
      && mLayoutManager.findFirstVisibleItemPosition() == -1 
      && mLayoutManager.findLastVisibleItemPosition() == -1) { 
     return; 
    } 
    int findFirstVisibleItemPosition = mLayoutManager.findFirstVisibleItemPosition(); 
    int findLastVisibleItemPosition = mLayoutManager.findLastVisibleItemPosition(); 

    int [] positions = {findFirstVisibleItemPosition, findLastVisibleItemPosition}; 
    ViewHolder viewHolder; 
    Rect scrollBounds = new Rect(); 
    mRecyclerView.getDrawingRect(scrollBounds); 
    int location[] = new int[2]; 
    for (int position : positions) { 
     viewHolder = mRecyclerView.getChildViewHolder(
       mLayoutManager.findViewByPosition(position)); 
     viewHolder.getMySpecialView().getLocationInWindow(location); 

     if (location[1] < 0 || location[1] > scrollBounds.bottom) { 
      // do stuff 
     } 
    } 
} 
+0

ありがとう、それは私を助けた。 – LeShChEnKoUa

関連する問題