[英]How to programmatically detect when an item is visible in a RecyclerView?
我的 Android 應用程序有一個帶有 PagerSnapHelper 的 RecyclerView。 每個項目的寬度和高度為match_parent
。 因此,只有 1 個視圖項留在頁面上。 我有興趣知道特定視圖項何時對用戶完全可見。 我想對該視圖執行一些操作。
我使用MpAndroidChart庫在每個視圖項中顯示圖表。 我也在為這些圖表制作動畫。 但是由於 RecyclerView 加載了一些與當前可見的視圖項相鄰的視圖項,動畫發生在視圖對用戶可見之前。 因此,我需要一個回調方法來確定某個特定的視圖項對用戶可見。 這樣我就可以在那個時候為我的圖表制作動畫。
我嘗試了以下方法來確定當前可見的項目視圖是什么。 但這並沒有解決我的問題:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState != RecyclerView.SCROLL_STATE_DRAGGING) {
View centerView = snapHelper.findSnapView(linearLayoutManager);
BarChart barChart = centerView.findViewById(R.id.barChart);
barChart.animateXY(ChartUtil.TIME, ChartUtil.TIME);
}
}
});
為 RecyclerView 的每個項目視圖實現邏輯的唯一已知回調方法是onBindViewHolder
。 但問題是如果當前可見的項目位置是(假設)x,那么 RecyclerView 也會提前加載 x+1 以便滾動保持平滑。 因此,在視圖對用戶可見之前,動畫項目視圖(在我的例子中)的邏輯也會被執行。 因此,我需要一個回調方法來告訴我 x 位置(或)項目視圖對用戶“可見”。
任何幫助將不勝感激!
抱歉在 Kotlin 上回答,我現在無法在 Java 上快速檢查。 但我希望它也是可讀的:
recycler_view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (layoutManager.findViewByPosition(layoutManager.findFirstVisibleItemPosition()).y == 0) {
// Do what you need
}
}
})
所以你只需要找到第一個可見位置的偏移量。 如果它等於 0,則您的項目完全顯示。
使用此代碼:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
LinearLayoutManager linearLayoutManager= (LinearLayoutManager) recyclerView.getLayoutManager();
linearLayoutManager.findFirstCompletelyVisibleItemPosition();
linearLayoutManager.findLastCompletelyVisibleItemPosition();
}
});
Mumayank,請不要忘記發布您的解決方案。 我正面臨着同樣的情況
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.