のソースコードをしばらくチェックした後、ListView
からインスピレーションを得てこれを解決することができましたListView.onSizeChanged()
。重要なのは、ListViewのサイズが実際に変更された後にスクロールを実行することでした。関数を使用してこれを行うことができますpost
。
コードは次のとおりです(スクロールせず、正しい位置を設定するだけですが、アイデアは得られます)。
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (mFooterView.getVisibility() == View.GONE) {
mFooterView.setVisibility(View.VISIBLE);
// at this point, the listview's height hasn't changed yet
int listOldHeight = parent.getHeight();
if (mItemAutoVisibilityScroller == null) {
mItemAutoVisibilityScroller = new ItemAutoVisibilityScroller();
}
// allow the list to resize
mFooterView.post(mItemAutoVisibilityScroller.setup(listOldHeight, position, view.getTop(), view.getHeight()));
} else {
mFooterView.setVisibility(View.GONE);
}
}
private class ItemAutoVisibilityScroller implements Runnable {
private int mListOldHeight;
private int mPosition;
private int mItemTop;
private int mItemHeight;
public ItemAutoVisibilityScroller setup(int listOldHeight, int position, int itemTop, int itemHeight) {
mListOldHeight = listOldHeight;
mPosition = position;
mItemTop = itemTop;
mItemHeight = itemHeight;
return this;
}
public void run() {
final int textTop = mFooterView.getTop();
// is the item cut by the footer?
if (mItemTop + mItemHeight > textTop) {
int newItemTop = mListOldHeight - mFooterView.getHeight() - mItemHeight;
if (newItemTop < 0) {
newItemTop = 0;
}
// move the item just above the footer
mListView.setSelectionFromTop(mPosition, newItemTop);
}
}
}