这几天做项目,需要展现一个下拉刷新和上拉载入的ListView,下拉刷新从服务器取数据,下拉载入从数据库取数据。本来没什么问题,网上例子讲解一堆,但是问题是就是出不来。
dataList2 = getDataList(RWXX.RWZT_UPLOAD); if (dataList2.size() > 0) { myadapter2 = new MyAdapter(this, dataList2, RWXX.RWZT_UPLOAD); listView2 = (RefreshListView) ((LinearLayout) views[index]) .getChildAt(0); listView2.setAdapter(myadapter2); if(dataList2.size() >= listcount) { listView2.addFooterView(mLoadLayout); listView2.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { //正在滚动时回调,回调2-3次,手指没抛则回调2次。scrollState = 2的这次不回调 //回调顺序如下 //第1次:scrollState = SCROLL_STATE_TOUCH_SCROLL(1) 正在滚动 //第2次:scrollState = SCROLL_STATE_FLING(2) 手指做了抛的动作(手指离开屏幕前,用力滑了一下) //第3次:scrollState = SCROLL_STATE_IDLE(0) 停止滚动 //当滚到最后一行且停止滚动时,执行加载 if (isScrollToEnd && scrollState == OnScrollListener.SCROLL_STATE_IDLE) { //满足条件,加载数据 if (view.getLastVisiblePosition() == view.getCount() - 1) { new Thread( new Runnable() { public void run() { businessObj.setListScrolltimes(scrollTimes += 1); //改变数据 AppendData(RWXX.RWZT_UPLOAD); Log.i(TAG, "加载新数据 " + dataList2.size()); } } ).start(); /*mHandler.postDelayed(new Runnable() { @Override public void run() { } }, 0);*/ // 上传附件开始提示消息 Message msg = messagehandler.obtainMessage(); msg.what = DATA_LOADING; messagehandler.sendMessage(msg); } isScrollToEnd = false; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。 //firstVisibleItem:当前能看见的第一个列表项ID(从0开始) //visibleItemCount:当前能看见的列表项个数(小半个也算) //totalItemCount:列表项共数 /** 判断是否滚到最后一行 */ if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) { Log.i(TAG, "加载新数据... "); isScrollToEnd = true; mProgressLoadLayout.setVisibility(View.VISIBLE); mLoadLayout.setVisibility(View.VISIBLE); } } }); }
可是问题是数据改变了,界面什么效果都没有!
开始是直接读取数据,赋给数据集合dataList2,一直没有任何效果。
网上查找原因,有一些说法是adapter的数据源没有任何变化,导致ListView 不会刷新。
后来仅仅是改成addAll(Collections)就可以了。实在是太自以为然了,不是一个客观的、尽职的程序员啊!
特地记下此地,以后少走弯路!