自定义上拉刷新下拉加载ScrollView

public class HomeScrollView extends ScrollView{
    private int mode = 0;//当前scrollview处于的状态
    private final int done = 0;//完成
    private final int refreshing = 1;//刷新
    private final int loading = 2;//加载
    private int linHeight = 0;//临界值的高度
    private int height = 0;//自身的高度,header或者footer的高度
    private int maxHeight = 0;//最大的高度
    PointF p=new PointF();
    private Context context;
    private LinearLayout mLayout;
    private LinearLayout mContent;
    private LinearLayout mHear;
    private LinearLayout mfooter;
    int rate=3;
    private AnimationDrawable mfooterDrawable;
    private AnimationDrawable mHearDrawable;
    private float disY;
    HomeRefreshCallBack homeRefreshCallBack;
    private PointF m;


    public void setHomeRefreshCallBack(HomeRefreshCallBack homeRefreshCallBack){
        this.homeRefreshCallBack=homeRefreshCallBack;
    }
    public HomeScrollView(Context context) {
        this(context,null);
    }


    public HomeScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context=context;
        initView();
    }


    private void initView() {
        mLayout = new LinearLayout(context);
        mLayout.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        mLayout.setOrientation(LinearLayout.VERTICAL);
        mContent = new LinearLayout(context);
        mContent.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
        mContent.setOrientation(LinearLayout.HORIZONTAL);
        mHear = (LinearLayout) View.inflate(context, R.layout.home_scrollview_hear, null);
        mfooter = (LinearLayout) View.inflate(context, R.layout.home_scrollview_footer, null);
        ImageView mHearIV = (ImageView) mHear.findViewById(R.id.home_scrollview_hear_iv);
        mHearDrawable = (AnimationDrawable) mHearIV.getDrawable();
        ImageView mfooterIV = (ImageView) mfooter.findViewById(R.id.home_scrollview_hear_iv);
        mfooterDrawable = (AnimationDrawable) mfooterIV.getDrawable();
        mLayout.addView(mHear);
        mLayout.addView(mContent);
        mLayout.addView(mfooter);
        addView(mLayout);
        linHeight=40;
        maxHeight=100;
        mHear.measure(0,0);
        height=mHear.getMeasuredHeight();
        selectMode();
    }
    public void setcontent(View content) {
    content.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
     mContent.addView(content);
    }
    private void selectMode() {
    switch (mode){
        case done:
            if(mHearDrawable.isRunning()){
                mHearDrawable.stop();
            }
            if(mfooterDrawable.isRunning()){
                mfooterDrawable.stop();
            }
            mHear.setPadding(0,-height,0,0);
            mfooter.setPadding(0,0,0,-height);
            break;
        case refreshing:
            mHear.setPadding(0, 0, 0, 0);
            mHearDrawable.start();
            homeRefreshCallBack.refreshcallback();
            break;
        case loading:
            mfooter.setPadding(0,0,0,0);
            mfooterDrawable.start();
            homeRefreshCallBack.loadcallback();
            break;
    }
    }


    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (homeRefreshCallBack==null)
            return super.dispatchTouchEvent(ev);
        int action = ev.getAction();
        switch (action){
            case MotionEvent.ACTION_DOWN:
                p.y=ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                m = new PointF();
                m.y=ev.getY();
                disY = (m.y - p.y) / rate;
                if(getScrollY()<=0&&disY>=0){
                    if(mode==done){
                        mHear.setPadding(0,(int)(disY-height),0,0);
                        if(disY-height>=linHeight){
                            mode=refreshing;
                        }else {
                            mode=done;
                        }
                        if(disY-height>=maxHeight){
                            mHear.setPadding(0,maxHeight,0,0);
                        }
                        return  true;
                    }
                }


                if(getScrollY()+getHeight()>=computeVerticalScrollRange()&&disY<=0){
                    if(mode==done){
                        disY=Math.abs(disY);
                        mfooter.setPadding(0,0,0,(int)(disY-height));
                        if(disY-height>=linHeight){
                            mode=loading;
                            mfooter.setPadding(0,0,0,0);
                        }
                        if(disY-height>=maxHeight){
                            mfooter.setPadding(0,0,0,maxHeight);
                        }
                        return  true;
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                if(!mHearDrawable.isRunning()&&!mfooterDrawable.isRunning()){
                    selectMode();
                }
                break;
        }
        return super.dispatchTouchEvent(ev);
    }


    public void refreshcompleted() {
        mode=done;
        selectMode();
    }


    public void measureListViewHeight(HomecategoryAdapter adapter, ListView listview) {
        int listviewHeight=0;
        int count = adapter.getCount();
        for (int i = 0; i < count; i++) {
            View view = adapter.getView(i, null, null);
            view.measure(0, 0);
            int measuredHeight = view.getMeasuredHeight();
            listviewHeight+=measuredHeight;
        }
        listviewHeight+=listview.getDividerHeight()+listview.getPaddingTop()+listview.getPaddingBottom();
        listview.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,listviewHeight));
        listview.requestLayout();
    }
}




public class SeeSeeFragment   implements HomeRefreshCallBack {
    int index=0;
    private HomeScrollView scrollView;
    private LinearLayout advertlinear;
    private ListView listview;
    private View con;
    private FileSaveOrRead fileSaveOrRead;
    private  SeeSeeHandler homeHandler;
    private  BaseApplication baseApp;
    private  JsonUtil jsonUtil;
    private  HomeAdvert homeAdvert;
    private Context context;
    public SeeSeeFragment(FragmentActivity activity, int i) {
        index=i;
        this.context=activity;
        baseApp = (BaseApplication)context.getApplicationContext();
        fileSaveOrRead = new FileSaveOrRead(context);
        homeHandler = new SeeSeeHandler(context);
        jsonUtil = new JsonUtil();
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if(scrollView==null){
            intiView();
        }
        return scrollView;
    }


    private void initListView() {
        if (fileSaveOrRead.IsHave("data" + HttpHandler.SeeSeeSUCCESS + ".txt")) {
            String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.SeeSeeSUCCESS + ".txt");
            getAdertlast(readFile);
        } else {
            new HttpThread(context, homeHandler, baseApp.SEE1+index+baseApp.SEE2, "", HttpHandler.SeeSeeSUCCESS).start();
        }


    }


    private void initAdvert() {
        if (fileSaveOrRead.IsHave("data" + HttpHandler.ADDERTSUCCESS + ".txt")) {
            String readFile = fileSaveOrRead.ReadFile("data" + HttpHandler.ADDERTSUCCESS + ".txt");
            getAdertlast(readFile);
        } else {
            new HttpThread(context, homeHandler, BaseApplication.ADVERTURL, "", HttpHandler.ADDERTSUCCESS).start();
        }
    }
    private void getAdertlast(String str) {
        List<AdvertInfo> list=new JsonUtil().getadvert(str);
        homeAdvert = new HomeAdvert(list,context);
        RelativeLayout relativeLayout = homeAdvert.getrelative();
        advertlinear.addView(relativeLayout);
        homeAdvert.startthread();
    }




    private void intiView() {
        scrollView = (HomeScrollView) View.inflate(context, R.layout.view_seeseeframent, null);
        getContent();
        scrollView.setcontent(con);
    }
    private void getContent() {
        con = View.inflate(context, R.layout.seeseeframent_con1, null);
        advertlinear = (LinearLayout) con.findViewById(R.id.seesee_con_advert);
        listview = (ListView) con.findViewById(R.id.seesee_con_listview);
        if(index==5||index==6){
            advertlinear.setVisibility(View.GONE);
        }
        initAdvert();
        initListView();
        scrollView.setHomeRefreshCallBack(this);
    }


   


    @Override
    public void refreshcallback() {
        scrollView.postDelayed(new Runnable() {
            @Override
            public void run() {
                initListView();
                scrollView.refreshcompleted();
            }
        },3000);
    }


    @Override
    public void loadcallback() {
        scrollView.postDelayed(new Runnable() {
            @Override
            public void run() {
                scrollView.refreshcompleted();
            }
        }, 3000);
    }


}




接口必须实现
public interface HomeRefreshCallBack {
     void refreshcallback();
     void loadcallback();
}




SeeSeeFragment的布局
<?xml version="1.0" encoding="utf-8"?>
<com.example.youhuo.myview.HomeScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/seeseeframent_srcollview"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</com.example.youhuo.myview.HomeScrollView>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值