0

いくつListViewかのチェックボックスと、これらのチェックボックスの1つがチェックされたときに表示する必要のあるフッターがあります。

私が達成しようとしているのは、このフッターと重なるアイテムをクリックすると、ListView自動的にスクロールしてこのアイテムを表示することです。ListViewは正しく配置されており、さらにスクロールできることに注意してください。

onItemClicked関数でこれを試しましたが、今のところ機能していません。

if (mFooterView.getVisibility() != View.VISIBLE) {
    mFooterView.setVisibility(View.VISIBLE);

    mImagesListView.smoothScrollToPosition(position);
}

問題は、smoothScrollToPositionが現在の測定値を使用していることであるようです。これは。によって無効になりmFooterView.setVisibility(View.VISIBLE)ます。ただし、新しい測定値は、次の再描画まで利用できないようです。

とにかく私はこの効果を達成することができますか?どうもありがとう。

4

1 に答える 1

0

のソースコードをしばらくチェックした後、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);
        }
    }
}
于 2013-02-19T22:42:36.653 に答える