CustomのRecyclerViewのonSizeChangedをOverrideして、キーボードの開閉に応じたスクロールの調整を行います。
CustomRecyclerView.java
@Override
public void onSizeChanged(int w, int h, int oldw, int oldh) {
if (!canScrollVertically(View.SCROLL_INDICATOR_BOTTOM) && oldh > h) {
/* 最後までスクロール */
} else if (computeVerticalScrollRange() - computeVerticalScrollExtent() - computeVerticalScrollOffset() < oldh - h) {
layout(getLeft(), getTop(), getRight(), getBottom());
scrollBy(0, oldh - h);
} else {
scrollBy(0, -h + oldh);
}
}
調整方法
縦のScrollのRange、Extent、Offsetを計算してくれる各メソッドの結果から、あとどれくらい下にスクロールできるかを算出し、oldhとhの大小でキーボードが閉じたか開いたかを判断しています。
Range、Extent、Offsetの関係に関しては下のリンクがわかりやすいです。
Android の Custom View で Scrollbar を使用する
このコードでは横画面に切り替わった時や、キーボード開閉以外でサイズが変わった時などの対応も必要になるため、キーボード開閉のイベントが標準で実装される日が待たれますね。