0

2つのスクロール位置を同期させる必要がありますScrollViewsRelativeLayout内の2つのScrollViewのスクロールを同期

ScrollViewsには、それぞれ個別のRecyclerViewが含まれています(設計要件のため、同じScrollViewに入れることはできません)。

どうすれば実現できますか?

+0

RecyclerViewには同じデータが含まれていますか? –

+0

なぜScrollViewをまったく使用したいのですか? RecyclerViewには独自のスクロールロジックがあります。 :) –

+0

これらのデータには異なるデータが含まれていません.. @progressive_overload –

答えて

0

私は非常にあなたのデザインを変更するが、最初のスクロールビューのために、この

を達成するための方法があり、2変数xを定義し、y、および現在のスクロール位置

x = firstScrollView.getScrollX(); 
y = firstScrollView.getScrollY(); 

を取得し、これらを渡すことをお勧めします値を他のscrollView "scrollTo"メソッドに渡します。

のような:

ScrollView secondScrollView = (ScrollView)findViewById(R.id.scrollView); 
secondScrollView.scrollTo(x, y); 

試してうまくいかなかった場合:すべての

secondScrollView.post(new Runnable() { 
     @Override 
     public void run() { 
     secondScrollView.scrollTo(x, y); 
       } 
      }); 
0

まず、それが簡単にスクロールイベントを聞くために私たちを可能にするのでサポートライブラリからNestedScrollViewを使用しています。次に、NestedScrollViewの両方のリスナーをonScrollChangeに設定します。あなたは、例えばscrollView1ためにスクロールチェンジを受信すると、scrollView2ためscrollTo(...)を呼び出す:

scrollView1.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() { 
     @Override 
     public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 

      scrollView2.setOnScrollChangeListener(null); 
      scrollView2.scrollTo(scrollX, scrollY); 
      scrollView2.setOnScrollChangeListener(...); //SET SCROLL LISTENER AGAIN 

     } 
}); 

scrollView2ためscrollTo(..)を呼び出す前に、もう一度それを追加し、そのリスナーを削除します。そうでない場合、scrollTo(..)を呼び出すと、両方のリスナで無限のコールがNestedScrollView秒になる可能性があります。

もちろん、上記のようなコードをscrollView2に書き込む必要があります。

+0

批評はない正直な質問:なぜScrollViewを使うの?そしてNestedScrollViewを使うのはなぜですか?RecyclerViewには、デフォルトで独自のスクロールロジックがあります(私の答えを見てください)。 –

+0

質問はScrollViewsの同期についてです。私は彼らの中に入れたいものは気にしない。 –

+0

あなたの答えはより普遍的なものになるでしょう。 –

0

RecyclerView.OnScrollListenerRecyclerViewsに、addOnScrollListener(RecyclerView.OnScrollListener listener)で接続します。

イベントが発生したときにもう1つの位置を更新する:scrollTo(int x, int y)

どういうわけか、ユーザーがトリガーしたスクロールと(他のRecyclerViewsイベントからの)プログラムスクロールを区別してください。

Ugurcan Yildirimのように、更新したいScrollViewのリスナーを切り離す方法があります。

もう1つのオプションはブール値フラグisUserTriggeredです。 3番目の方法は、現在どのScrollViewが区別することに焦点を当てているかを判断することです(here参照)。

関連する問題