兩個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...