小结

来源:互联网 发布:如何查看linux内核 编辑:程序博客网 时间:2024/05/16 06:04

解决ScrollView和ListView冲突的几个方案

http://www.apkbus.com/android-161576-1-1.html


我用的第四种。

package com.qiubaiclient.customui;import android.content.Context;import android.util.AttributeSet;import android.widget.ListView;public class ListViewForScrollView extends ListView {public ListViewForScrollView(Context context) {super(context);}public ListViewForScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public ListViewForScrollView(Context context, AttributeSet attrs,int defStyle) {super(context, attrs, defStyle);}@Override/** * 重写该方法,达到使ListView适应ScrollView的效果 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}

因此再我的客户端中,现实评论这一部分就使用了这个方案。

先上截图。


package com.qiubaiclient.customui;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.View.MeasureSpec;import android.view.animation.LinearInterpolator;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.Button;import android.widget.ImageView;import android.widget.ListAdapter;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.RelativeLayout;import android.widget.TextView;import com.qiubaiclient.main.R;/** * <strong> Listview whick can do something when drop down or scroll to bottom. * for example, drop down to refresh and load more when scroll to * bottom</strong> * <ul> * <strong>DropDown Listener</strong> * <li>define isDropDownStyle="true" at layout xml or call * {@link #setDropDownStyle(boolean)} to enable drop down style before</li> * <li>{@link #setOnDropDownListener(OnDropDownListener)} set listener which * will be excuted when drop down, but you should call * {@link #onDropDownComplete()} manual at the end of listener to reinstate * status.</li> * <li>{@link #setHeaderDefaultText(String)}, * {@link #setHeaderLoadingText(String)}, {@link #setHeaderPullText(String)}, * {@link #setHeaderReleaseText(String)}, * {@link #setHeaderSecondText(CharSequence)} to set text</li> * </ul> * <ul> * <strong>OnBottom Listener</strong> * <li>define isOnBottomStyle="true" at layout xml or call * {@link #setOnBottomStyle(boolean)} to enable on bottom style before</li> * <li>{@link #setOnBottomListener(OnClickListener)} set listener which will be * excuted when scroll to bottom, but you should call * {@link #onBottomComplete()} manual at the end of listener to reinstate * status.</li> * <li>you can define isAutoLoadOnBottom="true" at layout xml or call * {@link #setAutoLoadOnBottom(boolean)} to enable auto call OnBottomListener * when scroll to bottom</li> * <li>{@link #setFooterDefaultText(String)}, * {@link #setFooterLoadingText(String)}, {@link #setFooterNoMoreText(String)} * to set text</li> * </ul> * <ul> * other setting see <a * href="http://www.trinea.cn/?p=523">http://www.trinea.cn/?p=523</a> * </ul> * <ul> * principle see <a * href="http://trinea.iteye.com/blog/1562281">http://trinea.iteye * .com/blog/1562281</a> * </ul> *  * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> 2012-5-20 */public class DropDownListView extends ListView implements OnScrollListener {private boolean isDropDownStyle = true;private boolean isOnBottomStyle = true;private boolean isAutoLoadOnBottom = false;private String headerDefaultText;private String headerPullText;private String headerReleaseText;private String headerLoadingText;private String footerDefaultText;private String footerLoadingText;private String footerNoMoreText;private Context context;/** header layout view **/private RelativeLayout headerLayout;private ImageView headerImage;private ProgressBar headerProgressBar;private TextView headerText;private TextView headerSecondText;/** footer layout view **/private RelativeLayout footerLayout;private ProgressBar footerProgressBar;private Button footerButton;private OnDropDownListener onDropDownListener;private OnScrollListener onScrollListener;/** rate about drop down distance and header padding top when drop down **/private float headerPaddingTopRate = 1.5f;/** min distance which header can release to loading **/private int headerReleaseMinDistance;/** whether bottom listener has more **/private boolean hasMore = true;/** whether show footer loading progress bar when loading **/private boolean isShowFooterProgressBar = true;/** whether show footer when no more data **/private boolean isShowFooterWhenNoMore = false;private int currentScrollState;private int currentHeaderStatus;/** whether reached top, when has reached top, don't show header layout **/private boolean hasReachedTop = false;/** image flip animation **/private RotateAnimation flipAnimation;/** image reverse flip animation **/private RotateAnimation reverseFlipAnimation;/** header layout original height **/private int headerOriginalHeight;/** header layout original padding top **/private int headerOriginalTopPadding;/** y of point which user touch down **/private float actionDownPointY;/** whether is on bottom loading **/private boolean isOnBottomLoading = false;public DropDownListView(Context context) {super(context);init(context);}public DropDownListView(Context context, AttributeSet attrs) {super(context, attrs);getAttrs(context, attrs);init(context);}public DropDownListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);getAttrs(context, attrs);init(context);}private void init(Context context) {this.context = context;initDropDownStyle();initOnBottomStyle();// should set, to run onScroll method and so onsuper.setOnScrollListener(this);}/** * init drop down style, only init once */private void initDropDownStyle() {if (headerLayout != null) {if (isDropDownStyle) {addHeaderView(headerLayout);} else {removeHeaderView(headerLayout);}return;}if (!isDropDownStyle) {return;}headerReleaseMinDistance = context.getResources().getDimensionPixelSize(R.dimen.drop_down_list_header_release_min_distance);flipAnimation = new RotateAnimation(0, 180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);flipAnimation.setInterpolator(new LinearInterpolator());flipAnimation.setDuration(250);flipAnimation.setFillAfter(true);reverseFlipAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseFlipAnimation.setInterpolator(new LinearInterpolator());reverseFlipAnimation.setDuration(250);reverseFlipAnimation.setFillAfter(true);headerDefaultText = context.getString(R.string.drop_down_list_header_default_text);headerPullText = context.getString(R.string.drop_down_list_header_pull_text);headerReleaseText = context.getString(R.string.drop_down_list_header_release_text);headerLoadingText = context.getString(R.string.drop_down_list_header_loading_text);LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);headerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_header, this, false);headerText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_default_text);headerImage = (ImageView) headerLayout.findViewById(R.id.drop_down_list_header_image);headerProgressBar = (ProgressBar) headerLayout.findViewById(R.id.drop_down_list_header_progress_bar);headerSecondText = (TextView) headerLayout.findViewById(R.id.drop_down_list_header_second_text);headerLayout.setClickable(true);headerLayout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onDropDown();}});headerText.setText(headerDefaultText);addHeaderView(headerLayout);measureHeaderLayout(headerLayout);headerOriginalHeight = headerLayout.getMeasuredHeight();headerOriginalTopPadding = headerLayout.getPaddingTop();currentHeaderStatus = HEADER_STATUS_CLICK_TO_LOAD;}/** * init on bottom style, only init once */private void initOnBottomStyle() {if (footerLayout != null) {if (isOnBottomStyle) {addFooterView(footerLayout);} else {removeFooterView(footerLayout);}return;}if (!isOnBottomStyle) {return;}footerDefaultText = context.getString(R.string.drop_down_list_footer_default_text);footerLoadingText = context.getString(R.string.drop_down_list_footer_loading_text);footerNoMoreText = context.getString(R.string.drop_down_list_footer_no_more_text);LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);footerLayout = (RelativeLayout) inflater.inflate(R.layout.drop_down_list_footer, this, false);footerButton = (Button) footerLayout.findViewById(R.id.drop_down_list_footer_button);footerButton.setDrawingCacheBackgroundColor(0);footerButton.setEnabled(true);footerProgressBar = (ProgressBar) footerLayout.findViewById(R.id.drop_down_list_footer_progress_bar);addFooterView(footerLayout);}/** * @return isDropDownStyle */public boolean isDropDownStyle() {return isDropDownStyle;}/** * @param isDropDownStyle */public void setDropDownStyle(boolean isDropDownStyle) {if (this.isDropDownStyle != isDropDownStyle) {this.isDropDownStyle = isDropDownStyle;initDropDownStyle();}}/** * @return isOnBottomStyle */public boolean isOnBottomStyle() {return isOnBottomStyle;}/** * @param isOnBottomStyle */public void setOnBottomStyle(boolean isOnBottomStyle) {if (this.isOnBottomStyle != isOnBottomStyle) {this.isOnBottomStyle = isOnBottomStyle;initOnBottomStyle();}}/** * @return isAutoLoadOnBottom */public boolean isAutoLoadOnBottom() {return isAutoLoadOnBottom;}/** * set whether auto load when on bottom *  * @param isAutoLoadOnBottom */public void setAutoLoadOnBottom(boolean isAutoLoadOnBottom) {this.isAutoLoadOnBottom = isAutoLoadOnBottom;}/** * get whether show footer loading progress bar when loading *  * @return the isShowFooterProgressBar */public boolean isShowFooterProgressBar() {return isShowFooterProgressBar;}/** * set whether show footer loading progress bar when loading *  * @param isShowFooterProgressBar */public void setShowFooterProgressBar(boolean isShowFooterProgressBar) {this.isShowFooterProgressBar = isShowFooterProgressBar;}/** * get isShowFooterWhenNoMore *  * @return the isShowFooterWhenNoMore */public boolean isShowFooterWhenNoMore() {return isShowFooterWhenNoMore;}/** * set isShowFooterWhenNoMore *  * @param isShowFooterWhenNoMore *            the isShowFooterWhenNoMore to set */public void setShowFooterWhenNoMore(boolean isShowFooterWhenNoMore) {this.isShowFooterWhenNoMore = isShowFooterWhenNoMore;}/** * get footer button *  * @return */public Button getFooterButton() {return footerButton;}@Overridepublic void setAdapter(ListAdapter adapter) {super.setAdapter(adapter);if (isDropDownStyle) {setSecondPositionVisible();}}@Overridepublic void setOnScrollListener(AbsListView.OnScrollListener listener) {onScrollListener = listener;}/** * @param onDropDownListener */public void setOnDropDownListener(OnDropDownListener onDropDownListener) {this.onDropDownListener = onDropDownListener;}/** * @param onBottomListener */public void setOnBottomListener(OnClickListener onBottomListener) {footerButton.setOnClickListener(onBottomListener);}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (!isDropDownStyle) {return super.onTouchEvent(event);}hasReachedTop = false;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:actionDownPointY = event.getY();break;case MotionEvent.ACTION_MOVE:adjustHeaderPadding(event);break;case MotionEvent.ACTION_UP:if (!isVerticalScrollBarEnabled()) {setVerticalScrollBarEnabled(true);}/** * set status when finger leave screen if first item visible and * header status is not HEADER_STATUS_LOADING * <ul> * <li>if current header status is HEADER_STATUS_RELEASE_TO_LOAD, * call onDropDown.</li> * <li>if current header status is HEADER_STATUS_DROP_DOWN_TO_LOAD, * then set header status to HEADER_STATUS_CLICK_TO_LOAD and hide * header layout.</li> * </ul> */if (getFirstVisiblePosition() == 0&& currentHeaderStatus != HEADER_STATUS_LOADING) {switch (currentHeaderStatus) {case HEADER_STATUS_RELEASE_TO_LOAD:onDropDown();break;case HEADER_STATUS_DROP_DOWN_TO_LOAD:setHeaderStatusClickToLoad();setSecondPositionVisible();break;case HEADER_STATUS_CLICK_TO_LOAD:default:break;}}break;}return super.onTouchEvent(event);}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,int visibleItemCount, int totalItemCount) {if (isDropDownStyle) {if (currentScrollState == SCROLL_STATE_TOUCH_SCROLL&& currentHeaderStatus != HEADER_STATUS_LOADING) {/** * when state of ListView is SCROLL_STATE_TOUCH_SCROLL(ListView * is scrolling and finger is on screen) and header status is * not HEADER_STATUS_LOADING * <ul> * if header layout is visiable, * <li>if height of header is higher than a fixed value, then * set header status to HEADER_STATUS_RELEASE_TO_LOAD.</li> * <li>else set header status to * HEADER_STATUS_DROP_DOWN_TO_LOAD.</li> * </ul> * <ul> * if header layout is not visiable, * <li>set header status to HEADER_STATUS_CLICK_TO_LOAD.</li> * </ul> */if (firstVisibleItem == 0) {headerImage.setVisibility(View.VISIBLE);int pointBottom = headerOriginalHeight+ headerReleaseMinDistance;if (headerLayout.getBottom() >= pointBottom) {setHeaderStatusReleaseToLoad();} else if (headerLayout.getBottom() < pointBottom) {setHeaderStatusDropDownToLoad();}} else {setHeaderStatusClickToLoad();}} else if (currentScrollState == SCROLL_STATE_FLING&& firstVisibleItem == 0&& currentHeaderStatus != HEADER_STATUS_LOADING) {/** * when state of ListView is SCROLL_STATE_FLING(ListView is * scrolling but finger has leave screen) and first item(header * layout) is visible and header status is not * HEADER_STATUS_LOADING, then hide first item, set second item * visible and set hasReachedTop true. */setSecondPositionVisible();hasReachedTop = true;} else if (currentScrollState == SCROLL_STATE_FLING&& hasReachedTop) {/** * when state of ListView is SCROLL_STATE_FLING(ListView is * scrolling but finger has leave screen) and hasReachedTop is * true(it's because flick back), then hide first item, set * second item visible. */setSecondPositionVisible();}}// if isOnBottomStyle and isAutoLoadOnBottom and hasMore, then call// onBottom function autoif (isOnBottomStyle && isAutoLoadOnBottom && hasMore) {if (firstVisibleItem > 0 && totalItemCount > 0&& (firstVisibleItem + visibleItemCount == totalItemCount)) {onBottom();}}if (onScrollListener != null) {onScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,totalItemCount);}}@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {if (isDropDownStyle) {currentScrollState = scrollState;if (currentScrollState == SCROLL_STATE_IDLE) {hasReachedTop = false;}}if (onScrollListener != null) {onScrollListener.onScrollStateChanged(view, scrollState);}}/** * drop down begin, adjust view status */private void onDropDownBegin() {if (isDropDownStyle) {setHeaderStatusLoading();}}/** * on drop down loading, you can call it by manual, but you should manual * call onBottomComplete at the same time. */public void onDropDown() {if (currentHeaderStatus != HEADER_STATUS_LOADING && isDropDownStyle&& onDropDownListener != null) {onDropDownBegin();onDropDownListener.onDropDown();}}/** * drop down complete, restore view status *  * @param secondText *            display below header text, if null, not display */public void onDropDownComplete(CharSequence secondText) {if (isDropDownStyle) {setHeaderSecondText(secondText);onDropDownComplete();}}/** * set header second text *  * @param secondText *            secondText display below header text, if null, not display */public void setHeaderSecondText(CharSequence secondText) {if (isDropDownStyle) {if (secondText == null) {headerSecondText.setVisibility(View.GONE);} else {headerSecondText.setVisibility(View.VISIBLE);headerSecondText.setText(secondText);}}}/** * drop down complete, restore view status */public void onDropDownComplete() {if (isDropDownStyle) {setHeaderStatusClickToLoad();if (headerLayout.getBottom() > 0) {invalidateViews();setSecondPositionVisible();}}}/** * on bottom begin, adjust view status */public void onBottomBegin() {if (isOnBottomStyle) {if (isShowFooterProgressBar) {footerProgressBar.setVisibility(View.VISIBLE);}footerButton.setText(footerLoadingText);footerButton.setEnabled(false);}}/** * on bottom loading, you can call it by manual, but you should manual call * onBottomComplete at the same time. */public void onBottom() {if (isOnBottomStyle && !isOnBottomLoading) {isOnBottomLoading = true;onBottomBegin();footerButton.performClick();}}/** * on bottom load complete, restore view status */public void onBottomComplete() {if (isOnBottomStyle) {if (isShowFooterProgressBar) {footerProgressBar.setVisibility(View.GONE);}if (!hasMore) {footerButton.setText(footerNoMoreText);footerButton.setEnabled(false);if (!isShowFooterWhenNoMore) {removeFooterView(footerLayout);}} else {footerButton.setText(footerDefaultText);footerButton.setEnabled(true);}isOnBottomLoading = false;}}/** * OnDropDownListener, called when header released *  * @author <a href="http://www.trinea.cn" target="_blank">Trinea</a> *         2012-5-31 */public interface OnDropDownListener {/** * called when header released */public void onDropDown();}/** * set second position visible(index is 1), because first position is header * layout */public void setSecondPositionVisible() {if (getAdapter() != null && getAdapter().getCount() > 0&& getFirstVisiblePosition() == 0) {setSelection(1);}}/** * set whether has more. if hasMore is false, onBottm will not be called * when listView scroll to bottom *  * @param hasMore */public void setHasMore(boolean hasMore) {this.hasMore = hasMore;}/** * get whether has more *  * @return */public boolean isHasMore() {return hasMore;}/** * get header layout view *  * @return */public RelativeLayout getHeaderLayout() {return headerLayout;}/** * get footer layout view *  * @return */public RelativeLayout getFooterLayout() {return footerLayout;}/** * get rate about drop down distance and header padding top when drop down *  * @return headerPaddingTopRate */public float getHeaderPaddingTopRate() {return headerPaddingTopRate;}/** * set rate about drop down distance and header padding top when drop down *  * @param headerPaddingTopRate */public void setHeaderPaddingTopRate(float headerPaddingTopRate) {this.headerPaddingTopRate = headerPaddingTopRate;}/** * get min distance which header can release to loading *  * @return headerReleaseMinDistance */public int getHeaderReleaseMinDistance() {return headerReleaseMinDistance;}/** * set min distance which header can release to loading *  * @param headerReleaseMinDistance */public void setHeaderReleaseMinDistance(int headerReleaseMinDistance) {this.headerReleaseMinDistance = headerReleaseMinDistance;}/*** * get header default text, default is * R.string.drop_down_list_header_default_text *  * @return */public String getHeaderDefaultText() {return headerDefaultText;}/** * set header default text, default is * R.string.drop_down_list_header_default_text *  * @param headerDefaultText */public void setHeaderDefaultText(String headerDefaultText) {this.headerDefaultText = headerDefaultText;if (headerText != null&& currentHeaderStatus == HEADER_STATUS_CLICK_TO_LOAD) {headerText.setText(headerDefaultText);}}/** * get header pull text, default is R.string.drop_down_list_header_pull_text *  * @return */public String getHeaderPullText() {return headerPullText;}/** * set header pull text, default is R.string.drop_down_list_header_pull_text *  * @param headerPullText */public void setHeaderPullText(String headerPullText) {this.headerPullText = headerPullText;}/** * get header release text, default is * R.string.drop_down_list_header_release_text *  * @return */public String getHeaderReleaseText() {return headerReleaseText;}/** * set header release text, default is * R.string.drop_down_list_header_release_text *  * @param headerReleaseText */public void setHeaderReleaseText(String headerReleaseText) {this.headerReleaseText = headerReleaseText;}/** * get header loading text, default is * R.string.drop_down_list_header_loading_text *  * @return */public String getHeaderLoadingText() {return headerLoadingText;}/** * set header loading text, default is * R.string.drop_down_list_header_loading_text *  * @param headerLoadingText */public void setHeaderLoadingText(String headerLoadingText) {this.headerLoadingText = headerLoadingText;}/** * get footer default text, default is * R.string.drop_down_list_footer_default_text *  * @return */public String getFooterDefaultText() {return footerDefaultText;}/** * set footer default text, default is * R.string.drop_down_list_footer_default_text *  * @param footerDefaultText */public void setFooterDefaultText(String footerDefaultText) {this.footerDefaultText = footerDefaultText;if (footerButton != null && footerButton.isEnabled()) {footerButton.setText(footerDefaultText);}}/** * get footer loading text, default is * R.string.drop_down_list_footer_loading_text *  * @return */public String getFooterLoadingText() {return footerLoadingText;}/** * set footer loading text, default is * R.string.drop_down_list_footer_loading_text *  * @param footerLoadingText */public void setFooterLoadingText(String footerLoadingText) {this.footerLoadingText = footerLoadingText;}/** * get footer no more text, default is * R.string.drop_down_list_footer_no_more_text *  * @return */public String getFooterNoMoreText() {return footerNoMoreText;}/** * set footer no more text, default is * R.string.drop_down_list_footer_no_more_text *  * @param footerNoMoreText */public void setFooterNoMoreText(String footerNoMoreText) {this.footerNoMoreText = footerNoMoreText;}/** status which you can click to load, init satus **/public static final int HEADER_STATUS_CLICK_TO_LOAD = 1;/** * status which you can drop down and then release to excute * onDropDownListener, when height of header layout lower than a value **/public static final int HEADER_STATUS_DROP_DOWN_TO_LOAD = 2;/** * status which you can release to excute onDropDownListener, when height of * header layout higher than a value **/public static final int HEADER_STATUS_RELEASE_TO_LOAD = 3;/** status which is loading **/public static final int HEADER_STATUS_LOADING = 4;/** * set header status to {@link #HEADER_STATUS_CLICK_TO_LOAD} */private void setHeaderStatusClickToLoad() {if (currentHeaderStatus != HEADER_STATUS_CLICK_TO_LOAD) {resetHeaderPadding();headerImage.clearAnimation();headerImage.setVisibility(View.GONE);headerProgressBar.setVisibility(View.GONE);headerText.setText(headerDefaultText);currentHeaderStatus = HEADER_STATUS_CLICK_TO_LOAD;}}/** * set header status to {@link #HEADER_STATUS_DROP_DOWN_TO_LOAD} */private void setHeaderStatusDropDownToLoad() {if (currentHeaderStatus != HEADER_STATUS_DROP_DOWN_TO_LOAD) {headerImage.setVisibility(View.VISIBLE);if (currentHeaderStatus != HEADER_STATUS_CLICK_TO_LOAD) {headerImage.clearAnimation();headerImage.startAnimation(reverseFlipAnimation);}headerProgressBar.setVisibility(View.GONE);headerText.setText(headerPullText);if (isVerticalFadingEdgeEnabled()) {setVerticalScrollBarEnabled(false);}currentHeaderStatus = HEADER_STATUS_DROP_DOWN_TO_LOAD;}}/** * set header status to {@link #HEADER_STATUS_RELEASE_TO_LOAD} */private void setHeaderStatusReleaseToLoad() {if (currentHeaderStatus != HEADER_STATUS_RELEASE_TO_LOAD) {headerImage.setVisibility(View.VISIBLE);headerImage.clearAnimation();headerImage.startAnimation(flipAnimation);headerProgressBar.setVisibility(View.GONE);headerText.setText(headerReleaseText);currentHeaderStatus = HEADER_STATUS_RELEASE_TO_LOAD;}}/** * set header status to {@link #HEADER_STATUS_LOADING} */private void setHeaderStatusLoading() {if (currentHeaderStatus != HEADER_STATUS_LOADING) {resetHeaderPadding();headerImage.setVisibility(View.GONE);headerImage.clearAnimation();headerProgressBar.setVisibility(View.VISIBLE);headerText.setText(headerLoadingText);currentHeaderStatus = HEADER_STATUS_LOADING;setSelection(0);}}/** * adjust header padding according to motion event *  * @param ev */private void adjustHeaderPadding(MotionEvent ev) {// adjust header padding according to motion event historyint pointerCount = ev.getHistorySize();if (isVerticalFadingEdgeEnabled()) {setVerticalScrollBarEnabled(false);}for (int i = 0; i < pointerCount; i++) {if (currentHeaderStatus == HEADER_STATUS_DROP_DOWN_TO_LOAD|| currentHeaderStatus == HEADER_STATUS_RELEASE_TO_LOAD) {headerLayout.setPadding(headerLayout.getPaddingLeft(),(int) (((ev.getHistoricalY(i) - actionDownPointY) - headerOriginalHeight) / headerPaddingTopRate),headerLayout.getPaddingRight(),headerLayout.getPaddingBottom());}}}/** * reset header padding */private void resetHeaderPadding() {headerLayout.setPadding(headerLayout.getPaddingLeft(),headerOriginalTopPadding, headerLayout.getPaddingRight(),headerLayout.getPaddingBottom());}/** * measure header layout *  * @param child */private void measureHeaderLayout(View child) {ViewGroup.LayoutParams p = child.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0, p.width);int lpHeight = p.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}/** * get attrs *  * @param context * @param attrs */private void getAttrs(Context context, AttributeSet attrs) {TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.drop_down_list_attr);isDropDownStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isDropDownStyle, false);isOnBottomStyle = ta.getBoolean(R.styleable.drop_down_list_attr_isOnBottomStyle, false);isAutoLoadOnBottom = ta.getBoolean(R.styleable.drop_down_list_attr_isAutoLoadOnBottom, false);ta.recycle();}@Override/** * 重写该方法,达到使ListView适应ScrollView的效果 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}}



这里使用了大神的库:

地址:http://www.trinea.cn/android/android-common-lib/


同时改动了一些代码。

修改点

遇到的问题:

  1. 刚进入画面我需要立即刷新数据。
  2. 再原代码中点击加载更多后滚动条没有显示,并且界面卡顿了。

于是我直接再外部调用了,

onBottom()它会底部注册的监听回调到onClick

/** * on bottom loading, you can call it by manual, but you should manual call * onBottomComplete at the same time. */public void onBottom() {if (isOnBottomStyle && !isOnBottomLoading) {isOnBottomLoading = true;onBottomBegin();footerButton.performClick();}}

另外,

// 设置末尾点击加载跟多forScrollView.setOnBottomListener(new OnClickListener() {@Overridepublic void onClick(View view) {// TODO Auto-generated method stub// 获取数据之前先检查网络是否可用if (Common.isNetConnected(CommentsActivity.this)) {forScrollView.onBottomBegin();page.addPage();getCommentsData();} else {ToastUtil.show(CommentsActivity.this,"当前网络不可用,建议检查网络连接状态。", Toast.LENGTH_SHORT);mHandler.sendEmptyMessage(MyHandlerThread.RESET_STATUS);}}});

显示调用

forScrollView.onBottomBegin();

这样就可以显示滚动条。


第三,并添加了下面的代码解决ScrollView和ListView的冲突问题。

@Override/** * 重写该方法,达到使ListView适应ScrollView的效果 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST);super.onMeasure(widthMeasureSpec, expandSpec);}



0 0
原创粉丝点击