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
}
}
これは非常に非効率的なようです。
方法アダプター内部がリサイクルと取り外しに関連しているように見えますが、単に画面の表示をスクロールするだけでは起こりません。
誰かが似たようなことをしたことがありますか?
これをやりたいと思っためのあなたの理由は何ですか? –
私はRecyclerView内でExoPlayerの動画を再生しています。 ViewHolder内には複数の動画が存在することがあります。少なくとも1つが画面からスクロールすると、プレイヤーを停止してリソースを解放する必要があります。 – vkislicins
おそらく 'View.getVisibility()'がより効率的です。これがあなたのユースケースを完全に満たすかどうかはわかりません。 –