私は解決策を見つけました。エレガントすぎるかどうかはわかりませんが、うまくいくので、誰かがもっと良いものを考え出さない限り、そのままにしておきます。
リストと一緒にスクロールしたいビューはカスタムビューであり、リストビューについて知っている必要があります。そこで、setListView(ListView listView)メソッドを実装します。
private int scrollY; //1
private Map<Integer, Integer> listViewItemHeights = new Hashtable<>();
public void setListView(final ListView listView) {
listView.setOnScrollListener(new OnScrollListener() { //2
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {} //3
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //4
View c = listView.getChildAt(0);
if (c != null) {
int oldScrollY = scrollY;
scrollY = -c.getTop();
listViewItemHeights.put(listView.getFirstVisiblePosition(), c.getHeight());
for (int i = 0; i < listView.getFirstVisiblePosition(); ++i) {
if (listViewItemHeights.get(i) != null)
scrollY += listViewItemHeights.get(i);
}
scrollBy(0, scrollY - oldScrollY);
}
}
});
}
コメントNo.1:これは現在のスクロール位置を追跡できる変数です。
コメントNo.2:スクロールリスナーを新しく設定して、カスタムビューにリストが表示されたときに通知する
コメントNo.3:この場合、これを実装する必要はありません。
コメントNo.4:ここで魔法が起こります。最後に、scrollY-oldScrollYでビューをスクロールすることに注意してください。最初に、このビットから始めましょう。oldScrollYは保持されたスクロール位置であり、scrollYは新しい位置です。それらの違いでスクロールする必要があります。scrollYの計算方法については、ここで私の答えを参照してください。AndroidはListViewで正確なスクロール位置を取得します。これは、リストビューでのスクロール位置の計算方法です。