下拉刷新------- 1.addHeaderView必须在setAdapter之前调用 2.将paddingTop设置一个headerView高度的负值去隐藏它 getHeight()和getMeasuredHeight()的区别: getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用 它获取到宽高,在自定义控件内部多使用这个
使用view.measure(0,0)方法可以主动通知系统去测量,然后就 可以直接使用它获取宽高 getHeight():必须在onLayout方法执行完后,才能获得宽高 view.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
int headerViewHeight = headerView.getHeight();//直接可以获取宽高 } }); 3.setSelection(position);将对应位置的item放置到屏幕顶端 RefreshListView ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | public class RefreshListView extends ListView implements OnScrollListener{ private View headerView;//headerView private ImageView iv_arrow; private ProgressBar pb_rotate; private TextView tv_state,tv_time; private View footerView; private int footerViewHeight; private int headerViewHeight;//headerView高 private int downY;//按下时y坐标 private final int PULL_REFRESH = 0;//下拉刷新的状态 private final int RELEASE_REFRESH = 1;//松开刷新的状态 private final int REFRESHING = 2;//正在刷新的状态 private int currentState = PULL_REFRESH; private RotateAnimation upAnimation,downAnimation; private boolean isLoadingMore = false ;//当前是否正在处于加载更多 public RefreshListView(Context context) { super(context); init(); } public RefreshListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init(){ setOnScrollListener(this); initHeaderView(); initRotateAnimation(); initFooterView(); } /** * 初始化headerView */ private void initHeaderView() { headerView = View.inflate(getContext(), R.layout.layout_header, null ); iv_arrow = (ImageView) headerView.findViewById(R.id.iv_arrow); pb_rotate = (ProgressBar) headerView.findViewById(R.id.pb_rotate); tv_state = (TextView) headerView.findViewById(R.id.tv_state); tv_time = (TextView) headerView.findViewById(R.id.tv_time); headerView.measure(0, 0 );//主动通知系统去测量该view; headerViewHeight = headerView.getMeasuredHeight(); headerView.setPadding(0, -headerViewHeight, 0, 0); addHeaderView(headerView); } /** * 初始化旋转动画 */ private void initRotateAnimation() { upAnimation = new RotateAnimation( 0, -180, RotateAnimation.RELATIVE_TO_SELF, 0 .5f, RotateAnimation.RELATIVE_TO_SELF, 0 .5f); upAnimation.setDuration(300); upAnimation.setFillAfter(true); downAnimation = new RotateAnimation(- 180, -360, RotateAnimation.RELATIVE_TO_SELF, 0 .5f, RotateAnimation.RELATIVE_TO_SELF, 0 .5f); downAnimation.setDuration(300); downAnimation.setFillAfter(true); } private void initFooterView() { footerView = View.inflate(getContext(), R.layout.layout_footer, null); footerView.measure(0, 0 );//主动通知系统去测量该view; footerViewHeight = footerView.getMeasuredHeight(); footerView.setPadding(0, -footerViewHeight, 0 , 0); addFooterView(footerView); }
@Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: downY = (int) ev.getY(); break; case MotionEvent.ACTION_MOVE: if(currentState==REFRESHING){ break; } int deltaY = (int) (ev.getY() - downY); int paddingTop = -headerViewHeight + deltaY; if(paddingTop>-headerViewHeight && getFirstVisiblePosition()== 0){ headerView.setPadding(0, paddingTop, 0, 0); // Log.e("RefreshListView", "paddingTop: "+paddingTop);
if(paddingTop>=0 && currentState==PULL_REFRESH){ //从下拉刷新进入松开刷新状态 currentState = RELEASE_REFRESH; refreshHeaderView(); }else if (paddingTop<0 && currentState==RELEASE_REFRESH) { //进入下拉刷新状态 currentState = PULL_REFRESH; refreshHeaderView(); }
return true; //拦截TouchMove,不让listview处理该次move事件,会造成listview无法滑动 } break; case MotionEvent.ACTION_UP: if(currentState==PULL_REFRESH){ //隐藏headerView headerView.setPadding(0, -headerViewHeight, 0, 0); }else if (currentState==RELEASE_REFRESH) { headerView.setPadding(0, 0, 0, 0); currentState = REFRESHING; refreshHeaderView(); if(listener!=null ){ listener.onPullRefresh(); } } break; } return super.onTouchEvent(ev); } /** * 根据currentState来更新headerView */ private void refreshHeaderView(){ switch (currentState) { case PULL_REFRESH: tv_state.setText("下拉刷新"); iv_arrow.startAnimation(downAnimation); break; case RELEASE_REFRESH: tv_state.setText("松开刷新"); iv_arrow.startAnimation(upAnimation); break; case REFRESHING: iv_arrow.clearAnimation();//因为向上的旋转动画有可能没有执行完 iv_arrow.setVisibility(View.INVISIBLE); pb_rotate.setVisibility(View.VISIBLE); tv_state.setText("正在刷新..."); break; } } /** * 完成刷新操作,重置状态,在你获取完数据并更新完adater之后,去在UI线程中调用该方法 */ public void completeRefresh(){ if(isLoadingMore){ //重置footerView状态 footerView.setPadding(0, -footerViewHeight, 0, 0); isLoadingMore = false; }else { //重置headerView状态 headerView.setPadding(0, -headerViewHeight, 0, 0); currentState = PULL_REFRESH; pb_rotate.setVisibility(View.INVISIBLE); iv_arrow.setVisibility(View.VISIBLE); tv_state.setText("下拉刷新"); tv_time.setText("最后刷新:"+getCurrentTime()); } } /** * 获取当前系统时间,并格式化 * @return */ private String getCurrentTime(){ SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd HH:mm:ss" ); return format.format(new Date()); } private OnRefreshListener listener; public void setOnRefreshListener(OnRefreshListener listener){ this.listener = listener; } public interface OnRefreshListener{ void onPullRefresh(); void onLoadingMore(); } /** * SCROLL_STATE_IDLE:闲置状态,就是手指松开 * SCROLL_STATE_TOUCH_SCROLL:手指触摸滑动,就是按着来滑动 * SCROLL_STATE_FLING:快速滑动后松开 */ @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState==OnScrollListener.SCROLL_STATE_IDLE && getLastVisiblePosition()==(getCount()-1 ) &&!isLoadingMore){ isLoadingMore = true;
footerView.setPadding(0, 0 , 0, 0);//显示出footerView setSelection(getCount());//让listview最后一条显示出来
if(listener!=null){ listener.onLoadingMore(); } } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } } |
MainActivity ?
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | public class MainActivity extends Activity { private RefreshListView refreshListView;
private ArrayList<String> list = new ArrayList<String>(); private MyAdapter adapter; private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //更新UI adapter.notifyDataSetChanged(); refreshListView.completeRefresh(); }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initView(); initData(); } private void initView() { requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); refreshListView = (RefreshListView) findViewById(R.id.refreshListView); } private void initData() { for (int i = 0; i < 15; i++) { list.add("listview原来的数据 - "+i); } // final View headerView = View.inflate(this, R.layout.layout_header, null); //第一种方法 // headerView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { // @Override // public void onGlobalLayout() { // headerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); // int headerViewHeight = headerView.getHeight(); // // // Log.e("MainActivity", "headerViewHeight: "+headerViewHeight); // headerView.setPadding(0, -headerViewHeight, 0, 0); // refreshListView.addHeaderView(headerView);// // } // }); //第二种方法 // headerView.measure(0, 0);//主动通知系统去测量 // int headerViewHeight = headerView.getMeasuredHeight(); // Log.e("MainActivity", "headerViewHeight: "+headerViewHeight); // headerView.setPadding(0, -headerViewHeight, 0, 0); // refreshListView.addHeaderView(headerView);//
adapter = new MyAdapter(); refreshListView.setAdapter(adapter); refreshListView.setOnRefreshListener(new OnRefreshListener() { @Override public void onPullRefresh() { //需要联网请求服务器的数据,然后更新UI requestDataFromServer(false); } @Override public void onLoadingMore() { requestDataFromServer(true ); } }); } /** * 模拟向服务器请求数据 */ private void requestDataFromServer(final boolean isLoadingMore){ new Thread(){ public void run() { SystemClock.sleep(3000 );//模拟请求服务器的一个时间长度 if(isLoadingMore){ list.add("加载更多的数据-1" ); list.add("加载更多的数据-2" ); list.add("加载更多的数据-3" ); }else { list.add(0 , "下拉刷新的数据"); }
//在UI线程更新UI handler.sendEmptyMessage(0 ); }; }.start(); } class MyAdapter extends BaseAdapter{ @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId( int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView = new TextView(MainActivity.this); textView.setPadding(20 , 20, 20, 20 ); textView.setTextSize(18 );
textView.setText(list.get(position)); return textView; } } } |