Androidノート1-listview(gridview)ドロップダウンリフレッシュ

4605 ワード

ドロップダウンリフレッシュ効果はアプリでよく見られるアニメーション効果で、この間この効果を完成させるには、後続のノートで紹介するNestedScrollingも含まれているいくつかの案を試してみました.ここではまず基本的な方法を紹介し、Viewをカスタマイズすることで実現します.
実現原理:
カスタムの親Viewには、まず2つの分子Viewが含まれます.頭部(リフレッシュの効果はここで設計されています)とListView部分です.最初のレイアウトでは、まず頭を隠し、リストビューを最上部にスライドさせると、親ビューはスライドリスニングを遮断し、頭を指のスライドに合わせてゆっくり表示させます.
具体的な手順:
1まず、ビューをカスタマイズしてビューグループから継承し(レイアウトを容易にするために、ここではLinearLayoutを親とするビューグループ)、ヘッダサブビューとListViewを初期化します.
private void initHeaderView() {
    mHeaderView = mInflater.inflate(R.layout.XXX,null);
    this.addView(mHeaderView, 0);
}

2 onLayoutを書き換え、頭部Viewの高さhを取得し、頭部に対するpaddingを-hに設定することで頭部を隠す.
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    super.onLayout(changed, l, t, r, b);

    if (changed && mHeaderHeight <= 0) {
        mHeaderHeight = mHeaderView.getHeight();
        adjustPadding(-mHeaderHeight);
    }
}
private void adjustPadding(int topPadding) {
    mHeaderView.setPadding(mHeaderView.getPaddingLeft(), topPadding,
            mHeaderView.getPaddingRight(), 0);
}

3 onInterceptTouchEventを書き換え、ListViewをトップにスライドさせるときにスライドをカットします.先端にスライドしたと判断するプログラムは以下の通りです.
protected boolean isTop() {
    View firstChild = mGridtView.getChildAt(0);
    if (firstChild == null) {
        return true;
    }
    return (mGridtView.getFirstVisiblePosition() == 0)
            && (firstChild.getTop() >= 0);
}

その基本思想は可視positionが0であり、頂部距離が0である(最頂部のitemが完全に可視であることを保証してからドロップダウンリフレッシュに応答する)
4 onTouchEventを書き換え、指が滑る距離に合わせて頭部Viewとtopのpaddingを調整します.指を上げるとpaddingを再設定して隠します.