Android PullDownListView ScrollView Adapter之间下拉刷新重叠之坑以及解决办法

来源:互联网 发布:阿里网站购买域名 编辑:程序博客网 时间:2024/06/06 18:35

         自学Android一年了,做了大大小小一些App,参与了项目前台后台开发一年以来,个人感觉进步很大,遇到过很多坑。但是总是因为时间和文笔太烂无处下手没有记录自己的学习心得,真是遗憾。今天晚上遇到这个问题是第二次了,突然想到自己第一次解决问题的痛苦,那种经历历历在目。所以一定要mark一下记录自己遇到的坑。

        上图,就是这种效果:

错误代码:

 <com.app.controls.PullDownListView            android:id="@+id/bill_list_listView_billlist"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:background="@android:color/white"            android:cacheColorHint="#00000000"            android:divider="@drawable/line"            android:dividerHeight="2dp"            android:fadingEdge="none"            android:footerDividersEnabled="true" >        </com.app.controls.PullDownListView>




正确代码:

       

 <com.app.controls.PullDownListView            android:id="@+id/bill_list_listView_billlist"            android:layout_width="match_parent"            android:layout_height="match_parent"            android:background="@android:color/white"            android:cacheColorHint="#00000000"            android:divider="@drawable/line"            android:dividerHeight="2dp"            android:fadingEdge="none"            android:footerDividersEnabled="true" >        </com.app.controls.PullDownListView>



         真是太尴尬了。本来在模拟器上还好好的,我自己用真机测了一下吓我一跳,这个熟悉的错误又回来了。记得第一次各种搜listview下拉刷新和scrollView嵌套的下拉冲突等,有高手说重新计算一下内容所占高度,然后做scrollToTop操作,具体博客地址不记得了。但是我记得后来是因为我的一个属性把我坑了,就是pullListView一定不要写wrap_content属性,一定要改成match_parent。就这个问题,我自己mark一下,以免以后还犯这种错误~


福利来了,下拉刷新的点击加载更多的ListView源码来了~~

public class PullDownListView extends ListView implements OnScrollListener {private final static int RELEASE_To_REFRESH = 0;private final static int PULL_To_REFRESH = 1;// 正在刷新private final static int REFRESHING = 2;// 刷新完成private final static int REFRESH_DONE = 3;private final static int LOADING = 4;private final int FETCHMORING = 5;private final int FETCHMORE_DONE = 6;private final int FETCHMORE_NOTHING_DONE = 7;private final static int RATIO = 3;private LayoutInflater inflater;private LinearLayout headView;private TextView tipsTextview;private TextView lastUpdatedTextView;private ImageView arrowImageView;private ProgressBar progressBar;private LinearLayout footView;private TextView textviewMore;private ProgressBar progressBarMore;//private LinearLayout linearLayoutSpliter;private int moreState;private RotateAnimation animation;private RotateAnimation reverseAnimation;private boolean isRecored;private int headContentWidth;private int headContentHeight;private int startY;private int firstItemIndex;private int state;private boolean isBack;private OnRefreshListener refreshListener;private boolean isRefreshable;int i = 1;public PullDownListViewV2(Context context) {super(context);init(context);}public PullDownListViewV2(Context context, AttributeSet attrs) {super(context, attrs);init(context);}private void init(Context context) {setCacheColorHint(context.getResources().getColor(R.color.transparent));inflater = LayoutInflater.from(context);headView = (LinearLayout) inflater.inflate(R.layout.scrollover_head, null);arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);arrowImageView.setMinimumWidth(100);arrowImageView.setMinimumHeight(50);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);tipsTextview = (TextView) headView.findViewById(R.id.head_tipsTextView);lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);measureView(headView);headContentHeight = headView.getMeasuredHeight();headContentWidth = headView.getMeasuredWidth();headView.setPadding(0, -1 * headContentHeight, 0, 0);headView.invalidate();Log.v("@@@@@@", "width:" + headContentWidth + " height:"+ headContentHeight);addHeaderView(headView, null, false);setOnScrollListener(this);animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());animation.setDuration(250);animation.setFillAfter(true);reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);state = REFRESH_DONE;footView = (LinearLayout) inflater.inflate(R.layout.scrollover_footer, null);textviewMore = (TextView) footView.findViewById(R.id.textviewFetchMore);textviewMore.setText(R.string.pulldown_footer_more);progressBarMore = (ProgressBar) footView.findViewById(R.id.progressBar);footView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {moreState = FETCHMORING;changeFooterView();refreshListener.onMore();}});//addFooterView(footView, null, false);//linearLayoutSpliter = (LinearLayout) footView//.findViewById(R.id.linearLayoutSpliter);//linearLayoutSpliter.setVisibility(View.VISIBLE);isRefreshable = false;}public void onScroll(AbsListView arg0, int firstVisiableItem, int arg2,int arg3) {firstItemIndex = firstVisiableItem;}private int ListPos = 0;public void onScrollStateChanged(AbsListView arg0, int scrollState) {if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {ListPos = getFirstVisiblePosition(); // ListPos记录当前可见的List顶端的一行的位置}}private final Handler mHandler = new Handler();private Runnable mScrollTo = new Runnable() {@Overridepublic void run() {setSelection(ListPos);}};public boolean onTouchEvent(MotionEvent event) {if (isRefreshable) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (firstItemIndex == 0 && !isRecored) {isRecored = true;startY = (int) event.getY();Log.v("@@@@@@", "ACTION_DOWN 这是第  " + i++ + "步" + 1);}break;case MotionEvent.ACTION_UP:if (state != REFRESHING && state != LOADING) {if (state == REFRESH_DONE) {}if (state == PULL_To_REFRESH) {state = REFRESH_DONE;Log.v("@@@@@@","ACTION_UP PULL_To_REFRESH and changeHeaderViewByState()"+ " 这是第  " + i++ + "步前" + 2);changeHeaderViewByState();Log.v("@@@@@@","ACTION_UP PULL_To_REFRESH and changeHeaderViewByState() "+ "这是第  " + i++ + "步后" + 2);}if (state == RELEASE_To_REFRESH) {state = REFRESHING;Log.v("@@@@@@","ACTION_UP RELEASE_To_REFRESH changeHeaderViewByState() "+ "这是第  " + i++ + "步" + 3);changeHeaderViewByState();onRefresh();Log.v("@@@@@@","ACTION_UP RELEASE_To_REFRESH changeHeaderViewByState()"+ " 这是第  " + i++ + "步" + 3);}}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) event.getY();if (!isRecored && firstItemIndex == 0) {isRecored = true;startY = tempY;Log.v("@@@@@@", "ACTION_MOVE 这是第  " + i++ + "步" + 4);}if (state != REFRESHING && isRecored && state != LOADING) {if (state == RELEASE_To_REFRESH) {setSelection(0);if (((tempY - startY) / RATIO < headContentHeight)&& (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();Log.v("@@@@@@", "changeHeaderViewByState() 这是第  "+ i++ + "步" + 5);} else if (tempY - startY <= 0) {state = REFRESH_DONE;changeHeaderViewByState();Log.v("@@@@@@","ACTION_MOVE RELEASE_To_REFRESH 2  changeHeaderViewByState "+ "这是第  " + i++ + "步" + 6);}}if (state == PULL_To_REFRESH) {setSelection(0);if ((tempY - startY) / RATIO >= headContentHeight) {state = RELEASE_To_REFRESH;isBack = true;Log.v("@@@@@@", "changeHeaderViewByState "+ "这是第  " + i++ + "步前" + 7);changeHeaderViewByState();Log.v("@@@@@@", "changeHeaderViewByState "+ "这是第  " + i++ + "步后" + 7);} else if (tempY - startY <= 0) {state = REFRESH_DONE;changeHeaderViewByState();Log.v("@@@@@@","ACTION_MOVE changeHeaderViewByState PULL_To_REFRESH 2"+ " 这是第  " + i++ + "步" + 8);}}if (state == REFRESH_DONE) {int top = getFirstVisiblePosition();int firstTop = 0;if (getChildAt(0) != null)firstTop = getChildAt(0).getTop();int listPadding = getListPaddingTop();if (top <= 0 && firstTop >= listPadding) {if (tempY - startY > 0) {state = PULL_To_REFRESH;Log.v("@@@@@@","ACTION_MOVE DONE changeHeaderViewByState "+ "这是第  " + i++ + "步前" + 9);changeHeaderViewByState();Log.v("@@@@@@","ACTION_MOVE DONE changeHeaderViewByState "+ "这是第  " + i++ + "步后" + 9);}}}if (state == PULL_To_REFRESH) {headView.setPadding(0, -1 * headContentHeight+ (tempY - startY) / RATIO, 0, 0);Log.v("@@@@@@", -1 * headContentHeight+ (tempY - startY) / RATIO+ "ACTION_MOVE PULL_To_REFRESH 3  这是第  " + i+++ "步" + 10);}if (state == RELEASE_To_REFRESH) {headView.setPadding(0, (tempY - startY) / RATIO- headContentHeight, 0, 0);Log.v("@@@@@@", "ACTION_MOVE PULL_To_REFRESH 4 这是第  "+ i++ + "步" + 11);}}break;}}return super.onTouchEvent(event);}private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:arrowImageView.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.startAnimation(animation);tipsTextview.setText(R.string.pulldown_header_up_refresh);Log.v("@@@@@@", "RELEASE_To_REFRESH 这是第  " + i++ + "步" + 12+ "请释放 刷新");break;case PULL_To_REFRESH:progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.VISIBLE);if (isBack) {isBack = false;arrowImageView.clearAnimation();arrowImageView.startAnimation(reverseAnimation);// tipsTextview.setText("isBack  is true !!!");} else {// tipsTextview.setText("isBack  is false !!!");}tipsTextview.setText(R.string.pulldown_header_down_refresh);Log.v("@@@@@@", "PULL_To_REFRESH 这是第  " + i++ + "步" + 13+ "  changeHeaderViewByState()");break;case REFRESHING:headView.setPadding(0, 0, 0, 0);progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText(R.string.pulldown_header_refreshing);lastUpdatedTextView.setVisibility(View.VISIBLE);Log.v("@@@@@@", "REFRESHING 这是第  " + i++ + "步"+ "正在加载中 ...REFRESHING");break;case REFRESH_DONE:headView.setPadding(0, -1 * headContentHeight, 0, 0);progressBar.setVisibility(View.GONE);arrowImageView.clearAnimation();arrowImageView.setImageResource(R.drawable.z_arrow_down);tipsTextview.setText(R.string.pulldown_header_down_refresh);lastUpdatedTextView.setVisibility(View.VISIBLE);mHandler.post(mScrollTo);// showFooterView();int count = this.getAdapter().getCount();if(count > 8 && getFooterViewsCount() == 0)addFooterView(footView, null, false);else if(count <= 8 && getFooterViewsCount() > 0){removeFooterView(footView);}Log.v("@@@@@@", "Refresh DONE 这是第  " + i++ + "步" + "已经加载完毕- DONE ");break;}}private void changeFooterView() {switch (moreState) {case FETCHMORE_DONE:textviewMore.setText(R.string.pulldown_footer_more);progressBarMore.setVisibility(GONE);Logger.d("当前状态,fetch more done");break;case FETCHMORING:progressBarMore.setVisibility(VISIBLE);textviewMore.setText(R.string.pulldown_load_more);Logger.d("当前状态,fetch moring");break;case FETCHMORE_NOTHING_DONE:progressBarMore.setVisibility(VISIBLE);textviewMore.setText(R.string.pulldown_load_more);Logger.d("当前状态,fetch moring");}}public void removeFooter(){if(getFooterViewsCount() > 0){removeFooterView(footView);}}public void setonRefreshListener(OnRefreshListener refreshListener) {setonRefreshListener(refreshListener, true);}public void setonRefreshListener(OnRefreshListener refreshListener, boolean isRefresh) {this.refreshListener = refreshListener;isRefreshable = isRefresh;}public interface OnRefreshListener {public void onRefresh();public void onMore();//public void onInit();}public void onRefreshComplete() {state = REFRESH_DONE;lastUpdatedTextView.setText(R.string.pulldown_update);lastUpdatedTextView.setText(lastUpdatedTextView.getText()+ new Date().toLocaleString());changeHeaderViewByState();Log.v("@@@@@@", "onRefreshComplete() 被调用。。。");}public void onMoreComplete() {moreState = FETCHMORE_DONE;changeFooterView();}public void onMoreNothingComplete(){moreState = FETCHMORE_NOTHING_DONE;changeFooterView();}private void onRefresh() {if (refreshListener != null) {refreshListener.onRefresh();Log.v("@@@@@@", "onRefresh被调用,这是第  " + i++ + "步");}}private void measureView(View child) {ViewGroup.LayoutParams p = child.getLayoutParams();if (p == null) {p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 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);}public void setAdapter(BaseAdapter adapter) {lastUpdatedTextView.setText(R.string.pulldown_update);lastUpdatedTextView.setText(lastUpdatedTextView.getText()+ new Date().toLocaleString());super.setAdapter(adapter);}





                  

0 0