簡體   English   中英

如何以編程方式檢測項目何時在 RecyclerView 中可見?

[英]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);
        }
    }
});

編輯 1

為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM