package org.auie.ui; import org.auie.utils.UEViewHelper; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.view.View; import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.widget.AbsListView; import android.widget.AbsListView.OnScrollListener; import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.RelativeLayout; /** * * UIFlexListView * * @author Soniy7x * */ public class UIFlexListView extends FrameLayout implements OnScrollListener{ private RelativeLayout mContentLayout; private LinearLayout mHeaderLayout; private LinearLayout mHeaderContentLayout; private LinearLayout mHeaderActionBarLayout; private View mHeaderView; private UIListView mListView; private OnFlexListener mFlexListener; private boolean isReset = false; private boolean isSuspend = false; private int headerHeight; /** * 构造方法 */ public UIFlexListView(Context context) { super(context); createContentView(); } /** * 构造方法 */ public UIFlexListView(Context context, AttributeSet attrs) { super(context, attrs); createContentView(); } /** * 构造方法 */ public UIFlexListView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); createContentView(); } /** * 构建内容视图 */ private void createContentView() { mContentLayout = new RelativeLayout(getContext()); mContentLayout.setId(1992); mContentLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mHeaderView = new FrameLayout(getContext()); mHeaderView.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.MATCH_PARENT)); mHeaderView.setBackgroundColor(Color.WHITE); mHeaderView.setPadding(0, headerHeight, 0, 0); mListView = new UIListView(getContext()); mListView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mListView.setType(UIListView.TYPE_NONE); mListView.addHeaderView(mHeaderView); mListView.setBackgroundColor(Color.WHITE); mListView.setOnScrollListener(this); mHeaderLayout = new LinearLayout(getContext()); mHeaderLayout.setOrientation(LinearLayout.VERTICAL); mHeaderLayout.setBackgroundColor(Color.WHITE); mHeaderLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); mHeaderLayout.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { headerHeight = mHeaderLayout.getHeight(); resetHeaderView(headerHeight); } }); mHeaderContentLayout = new LinearLayout(getContext()); mHeaderContentLayout.setOrientation(LinearLayout.VERTICAL); mHeaderContentLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); mHeaderActionBarLayout = new LinearLayout(getContext()); mHeaderActionBarLayout.setBackgroundColor(Color.GRAY); mHeaderActionBarLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); mHeaderLayout.addView(mHeaderContentLayout); mHeaderLayout.addView(mHeaderActionBarLayout); mContentLayout.addView(mListView); addView(mContentLayout); addView(mHeaderLayout); } /** * 复写onScroll * @param view * @param firstVisibleItem * @param visibleItemCount * @param totalItemCount */ @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { float translationY = Math.max(-getScrollY(view), -mHeaderContentLayout.getHeight()); UEViewHelper.setTranslationY(mHeaderLayout, translationY); //判断是否已经悬停 if (translationY <= -mHeaderContentLayout.getHeight()) { isSuspend = true; }else { isSuspend = false; } if (mFlexListener != null) { mFlexListener.flexStatus(isSuspend); } if (visibleItemCount == totalItemCount && totalItemCount > 1) { isReset = true; } else { isReset = false; } } /** * 获得滑动距离 * @param view * @return */ private int getScrollY(AbsListView view) { View c = view.getChildAt(0); if (c == null) { return 0; } int firstVisiblePosition = view.getFirstVisiblePosition(); int top = c.getTop(); int headerHeight = 0; if (firstVisiblePosition >= 1) { headerHeight = mHeaderLayout.getHeight(); } return -top + firstVisiblePosition * c.getHeight() + headerHeight; } @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case OnScrollListener.SCROLL_STATE_IDLE: //控制上拉加载更多 if (isSuspend && view.getLastVisiblePosition() == (view.getCount() - 1)) { mListView.setType(UIListView.TYPE_ONLY_UP_LOADMORD); }else { mListView.setType(UIListView.TYPE_NONE); } break; default: break; } } /** * 重设列表状态 * @param scrollHeight */ public void resetListViewState(int scrollHeight){ if (isReset) { return; } if (mListView == null) { return; } if (scrollHeight == 0 && mListView.getFirstVisiblePosition() >= 1) { return; } mListView.setSelectionFromTop(1, scrollHeight); } /** * 重设头部列表Padding高度 * @param height */ public void resetHeaderView(int height){ if (mHeaderView != null) { mHeaderView.setPadding(0, height, 0, 0); } } /** * 获取列表视图 */ public UIListView getListView(){ return mListView; } /** * 获取内容视图 */ public LinearLayout getContentView(){ return mHeaderContentLayout; } /** * 获取悬停条视图 */ public LinearLayout getActionBarView(){ return mHeaderActionBarLayout; } public LinearLayout getHeaderLayout(){ return mHeaderLayout; } public OnFlexListener getOnFlexListener() { return mFlexListener; } public void setOnFlexListener(OnFlexListener mFlexListener) { this.mFlexListener = mFlexListener; } public static interface OnFlexListener{ public void flexStatus(boolean status); } }