当前位置:文档之家› Android基于GridView实现自定义上拉更多和下拉刷新

Android基于GridView实现自定义上拉更多和下拉刷新

//这个地方是有遗留的问题的最后还需要处理
北京千锋互联科技有限公司 版权所有
ht tp ://www.mobilet /
if(PullUpLoadView.getDownLoadingOrNot()){ return;
} mICallBack.notifactionAbovePage(LOAD); } } } }
} /**
* 定义一个接口回调到 Activity 页面 */ public interface PullCallBack{
public void load(); public void refresh(); } PullCallBack mPullCallBack=null;
public void setPullCallBacklistener(PullCallBack mPullCallBack ){ this.mPullCallBack=mPullCallBack;
ht tp ://www.mobilet /
} }
MyScrollView
public class MyScrollView extends ScrollView{ private static final String LOAD="load"; //表示的是加载数据的状态 private static final String REFRESH="refresh"; //表示的是需要刷新页面的状态 public MyScrollView(Context context, AttributeSet attrs) {
this.mICallBack=mICallBack; } @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt); if(getChildAt(0)!=null){ //有这个孩子才有意义的
View childView=getChildAt(0); //第二步:通过孩子获取孩子本身的高度 int childMeasuredHeight = childView.getMeasuredHeight(); //第三步:获取屏幕顶部的相对 y 坐标 int scrollY = getScrollY(); //屏幕顶部相对的 y 坐标 //第四步:获取当前屏幕的高度 int screenHeight=getHeight(); if(scrollY+screenHeight==childMeasuredHeight){ //说明滑动到底部了?
mMyGridView= (MyGridView) findViewById(R.id.gridView); footView= (LinearLayout) findViewById(R.id.footView); mMyScrollView= (MyScrollView) findViewById(R.id.myScrollView); } /** * 返回 GridView * @return */ public MyGridView getMyGridView(){ return mMyGridView; } /** * 设置 footView 影藏 */
} } };
/** * 获取是否正在加载数据的这个状态 * @return */
北京千锋互联科技有限公司 版权所有
ht tp ://www.mobilet /
public static boolean getDownLoadingOrNot(){ return downLoadingOrNot;
int heighMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, heighMeasureSpec);
北京千锋互联科技有限公司 版权所有
北京千锋互联科技有限公司 版权所有
ht tp ://www.mobilet /
//在这个地方我们书不是需要将这个状态发送到 Activity 这个页面去 mPullCallBack.load(); handler.sendEmptyMessage(100); downLoadingOrNot=true; //表示的额是正在加载 }else{ //说明需要刷新数据
super(context, attrs); initView(); } /** * 初始化数据用的 */ private void initView() { //初始化布局加载器 LayoutInflater mLayoutInflater= (LayoutInflater) getContext().getSystemService(YOUT_INFLATER_SERVICE); View view=mLayoutInflater.inflate(yout.scroll_grid_footview,this); //这句 话的意思是把当前的布局绑定给谁
super(context, attrs); } interface ICallBack{
public void notifactionAbovePage(String tag); } ICallBack mICallBack=null; public void setOnCallBackLister(ICallBack mICallBack){
北京千锋互联科技有限公司 ilet /
super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
3:需要解决什么时候滑动到了底部和顶部 解决方案:可以通过计算 ScrollView 孩子的高度,以及当前孩子滑动的顶部的相对的 Y 的偏移量 getScrollY 和当前窗体的高度 getHeight.如果 getScrollY+getHeight>=孩子的 高度,说明滑动到底部了 4:解决问题:ScrollView 知道了什么时候滑动到底部,如何将上级的状态 解决方案:直接通过回调的方法将状态在传递到上级页面 5:整合所有的对象 源代码如下: GridView public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs, int defStyleAttr) {
} /**
* 说明数据已经加载完成 * 这个方法是 Activity 调用的 */ public void dataDone(){
handler.sendEmptyMessage(101); } /**
* 找下那个 View * @param view */ private void findView(View view) {
super(context, attrs, defStyleAttr); } public MyGridView(Context context) {
super(context); } public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
} } } //刷新 UI Handler handler=new Handler(){ @Override public void handleMessage(Message msg) {
switch (msg.what){ case 100: //表示的是需要显示底部的 View setFootViewVisible(); break; case 101: //表示的是需要隐藏底部的 View setFootViewHide(); downLoadingOrNot=false; break;
} /**
* 上一个页面回调的状态 */ private class OnCallBack implements MyScrollView.ICallBack{
@Override public void notifactionAbovePage(String tag) {
if(tag.equals(LOAD)){ //说明需要加载数据
2:ScrollView 中嵌套 GridView 的时候会造成显示不全的问题,需要解决 ScrollView 计算孩子高度的问题
解决方案:可以重写 GridView 中的 onMeasure()方法,然后给定孩子高度的最大值,然后 再设计一个测量的模式.
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expectHeight=MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE>>2,MeasureSpec.AT_MO ST);
PullUpLoadView
public class PullUpLoadView extends LinearLayout{ private static final String LOAD="load"; //表示的是加载数据的状态 private static final String REFRESH="refresh";//表示的是需要刷新页面的状态 MyGridView mMyGridView; LinearLayout footView; MyScrollView mMyScrollView; static boolean downLoadingOrNot=false; //判断当前是否正在加载数据 public PullUpLoadView(Context context, AttributeSet attrs) {
相关主题