記錄如何實現兩個recycleview同步滾動

2021-09-19 03:31:40 字數 3689 閱讀 6317

兩個recycleview同步滾動網上solo的幾種方法如下:

我相信你了解它的工作原理是相關的,所以我將解釋我設計解決方案時所遵循的整個過程。請注意,此示例僅適用於兩個recyclerviews,但使用更多的recyclerviews就像使用recyclerviews陣列一樣簡單。

想到的第乙個選項是在兩個scrollviews上監聽滾動更改,當其中乙個滾動時,在另乙個上使用scrollby(int x,int y))。不幸的是,以程式設計方式滾動也會觸發偵聽器,因此您將最終處於迴圈中。

要解決此問題,您需要設定onitemtouchlistener,在觸控recyclerview時新增正確的scrolllistener,並在滾動停止時將其刪除。這幾乎完美無缺,但是如果你在乙個很長的recyclerview中快速執行,然後在它完成之前再次滾動它,只會傳輸第乙個滾動。

要解決此問題,您需要確保僅在recyclerview空閒時新增onscrolllistener。

public class selfremovingonscrolllistener extends recyclerview.onscrolllistener }}

這是您需要擴充套件onscrolllisteners的類。這可確保在需要時將其移除。

然後我有兩個***,每個recyclerview乙個:

private final recyclerview.onscrolllistener mleftosl = new selfremovingonscrolllistener() 

}, mrightosl = new selfremovingonscrolllistener()

};

然後在初始化時,您可以設定onitemtouchlisteners。最好為整個檢視設定乙個***,但recyclerview不支援這個。onitemtouchlisteners無論如何都不會造成問題:

mleftrecyclerview.addonitemtouchlistener(new recyclerview.onitemtouchlistener() 

return boolean.false;

}@override

public void ontouchevent(@nonnull final recyclerview rv, @nonnull final motionevent e)

else }}

@override

public void onrequestdisallowintercepttouchevent(final boolean disallowintercept)

});mrightrecyclerview.addonitemtouchlistener(new recyclerview.onitemtouchlistener()

return boolean.false;

}@override

public void ontouchevent(@nonnull final recyclerview rv, @nonnull final motionevent e)

else }}

@override

public void onrequestdisallowintercepttouchevent(final boolean disallowintercept)

});}

另請注意,在我的特定情況下,recyclerviews不是第乙個接收觸控事件的人,所以我需要攔截它。如果不是這種情況,您可以(應該)將onintercepttouchevent(…)中的**合併到ontouchevent(…)中。

最後,如果您的使用者嘗試同時滾動兩個recyclerviews,這將導致崩潰。這裡可能的最佳努力質量解決方案是android:splitmotionevents="false"在包含recyclerviews的直接父級中進行設定。

您可以在此處檢視此**的示例。

我想我找到了乙個非常容易和簡短的答案。

正如jorgeantoniodíaz-benito所說:「第乙個想到的選擇是在scrollviews上監聽滾動更改,當其中乙個滾動時,在另乙個上使用scrollby(int x,int y)。不幸的是,以程式設計方式滾動將也會觸發聽眾,所以你最終會陷入乙個迴圈。「

所以你需要解決這個問題。如果您只是跟蹤誰在滾動它們將不會迴圈。

public class selfscrollistener extends recyclerview.onscrolllistener }}

這是您自定義的onscrolllistener,用於檢查scrollstate是否為idle。這是真的 - >沒有人滾動。所以`int viewisscolling = -1

現在您需要檢測是否可以滾動。這是**:

int viewisscrolling = 1;

boolean firstistouched = false;

boolean secondistouched = false;

selfscrollistener firstosl= new selfscrollistener()

if (viewisscrolling == 0) }}

};selfscrollistener secondosl= new selfscrollistener()

if (viewisscrolling == 1) }}

};firstrecyclerview.setontouchlistener(new view.ontouchlistener()

});secondrecyclerview.setontouchlistener(new view.ontouchlistener()

});firstrecyclerview.addonscrolllistener(firstosl);

secondrecyclerview.addonscrolllistener(secondosl);

viewisscrolling =乙個全域性int並在開頭設定為-1; 沒有人滾動的狀態。您可以根據需要新增盡可能多的**檢視。

這是我的解決方案。**越少越好……

lvdetail和lvdetail2是您希望保持同步的recyclerview。

final recyclerview.onscrolllistener scrolllisteners = new recyclerview.onscrolllistener[2];

scrolllisteners[0] = new recyclerview.onscrolllistener( )

};scrolllisteners[1] = new recyclerview.onscrolllistener( )

};lvdetail.addonscrolllistener(scrolllisteners[0]);

lvdetail2.addonscrolllistener(scrolllisteners[1]);

<?xml version="1.0" encoding="utf-8"?>

剛開始用第一種方法,但是由於我的recyclerview外面套了個horizontalscrollview,所以在事件分發上會有問題,所以我用的是第三種方法實現了最終效果。

用兩個棧如何實現佇列?

在網上無意間看到了這個問題,記錄一下。首先,回憶一下棧與佇列的區別。棧,就是後進先出,而佇列,則是先進先出。可見,棧與佇列只是在彈出資料的順序上有區別。這也正是為什麼要用兩個棧來做佇列。假如有a b兩個棧,棧既然是後進先出,那麼最先進棧資料的就會在棧a的底部,如何讓它能先出棧?這就需要使用第二個棧b...

如何使用兩個佇列實現棧

實現思路分析 1 假設使用佇列q1和佇列q2模擬棧s,q1為入佇列,q2為出佇列。2 認為q1提供入佇列的操作,使用q2提供出佇列的操作。3 當需要入佇列的時候,直接將資料壓入q1棧中即可。4 當需要從佇列中取出資料的時候,就需要分情況考慮了。5 若佇列q1中只有乙個元素,則直接讓q1中元素出棧並輸...

兩個棧實現佇列 兩個佇列實現棧

1.兩個棧實現佇列 大致思路 入佇列時,將元素入棧s1,出佇列時,將s2中的元素出棧即可,如果s2為空,那麼將s1中 s1.size 1 個元素出棧,加入到s2中,然後將s1中最後乙個元素出棧,即完成了出佇列的操作 include using namespace std include includ...