Listview的下拉刷新和上拉加载

自定义的Listview

package project.bridgetek.com.bridgelib.MyControl;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import java.text.SimpleDateFormat;

import project.bridgetek.com.bridgelib.R;

/**
 * Created by czz on 19-5-7.
 */

public class MyListView extends ListView implements AbsListView.OnScrollListener {
    private View footview;
    private View headview;
    private int totaItemCounts;
    private int lasstVisible;
    private int fistVisiable;
    private LoadListener loadListener;
    private int footViewHeight;
    private int headViewHeight;
    private int yload;
    boolean isLoading;
    private TextView updateInfo;
    private TextView updateTime;
    private ProgressBar progressBar;
    private boolean up = false;
    private boolean refresh = false;

    public MyListView(Context context) {
        super(context);
        initView(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    private void initView(Context context) {
        //拿到头布局xml
        headview = LayoutInflater.from(context).inflate(R.layout.head_layouyt, null);
        updateInfo = (TextView) headview.findViewById(R.id.update_info);
        //updateTime = (TextView) headview.findViewById(R.id.update_time);
        progressBar = (ProgressBar) headview.findViewById(R.id.progressbar);
        //updateTime.setText("更新于:" + new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(System.currentTimeMillis()));
        //拿到尾布局xml
        footview = LayoutInflater.from(context).inflate(R.layout.footer_layout, null);
        //测量footview的高度
        footview.measure(0, 0);
        //拿到高度
        footViewHeight = footview.getMeasuredHeight();
        //隐藏view
        footview.setPadding(0, -footViewHeight, 0, 0);
        headview.measure(0, 0);
        headViewHeight = headview.getMeasuredHeight();
        headview.setPadding(0, -headViewHeight, 0, 0);
        //设置不可见
        // footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
        // headview.findViewById(R.id.head).setVisibility(View.GONE);
        //添加到listview底部
        this.addFooterView(footview);
        //添加到listview头部
        this.addHeaderView(headview);
        //设置拉动监听
        this.setOnScrollListener(this);


    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                yload = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveY = (int) ev.getY();
                Log.i("CONG", "onTouchEvent: " + yload + "?????/" + moveY);
                int i = moveY - yload;
                if (i > 0) {
                    up = false;
                    int paddingY = -headViewHeight + (moveY - yload) / 2;

                    if (paddingY < 0) {
                        updateInfo.setText("下拉刷新。。。");
                        progressBar.setVisibility(View.GONE);
                        refresh = false;
                    }
                    if (paddingY > 0) {
                        updateInfo.setText("松开刷新。。。");
                        progressBar.setVisibility(View.GONE);
                        refresh = true;
                    }

                    headview.setPadding(0, paddingY, 0, 0);

                    break;
                } else {
                    up = true;
                }

//            case MotionEvent.ACTION_UP:
//                headview.setPadding(0,0,0,0);
//                updateInfo.setText("正在刷新。。。");
//                progressBar.setVisibility(View.VISIBLE);
//                loadListener.pullLoad();
//
//                break;
        }
        return super.onTouchEvent(ev);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        if (up) {
            if (totaItemCounts == lasstVisible && scrollState == SCROLL_STATE_IDLE) {
                if (!isLoading) {
                    isLoading = true;
                    // footview.findViewById(R.id.foot_load).setVisibility(View.VISIBLE);
                    footview.setPadding(0, 0, 0, 0);
                    //加载数据
                    loadListener.onLoad();

                }
            }
        } else {
            if (refresh) {
                if (fistVisiable == 0) {
                    headview.setPadding(0, 0, 0, 0);
                    updateInfo.setText("正在刷新。。。");
                    progressBar.setVisibility(View.VISIBLE);
                    loadListener.pullLoad();
                }
            } else {
                loadComplete();
            }
        }
    }


    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        this.fistVisiable = firstVisibleItem;
        this.lasstVisible = firstVisibleItem + visibleItemCount;
        this.totaItemCounts = totalItemCount;

    }

    //加载完成
    public void loadComplete() {
        isLoading = false;
        //footview.findViewById(R.id.foot_load).setVisibility(View.GONE);
        footview.setPadding(0, -footViewHeight, 0, 0);
        headview.setPadding(0, -headViewHeight, 0, 0);


    }

    public void setInterface(LoadListener loadListener) {
        this.loadListener = loadListener;

    }

    //接口回调
    public interface LoadListener {

        void onLoad();

        void pullLoad();


    }
}

listv的头部视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/head"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp">

        <ProgressBar
            android:id="@+id/progressbar"
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/update_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="正在刷新。。。。" />

    </LinearLayout>

    <!--<LinearLayout-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:gravity="center">-->

        <!--<TextView-->
            <!--android:id="@+id/update_time"-->
            <!--android:layout_width="wrap_content"-->
            <!--android:layout_height="wrap_content" />-->
    <!--</LinearLayout>-->
</LinearLayout>

lisview的尾部视图:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/foot_load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:orientation="horizontal"
        android:padding="5dp">

        <ProgressBar
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="加载中。。。。" />
    </LinearLayout>

</LinearLayout>

activity或fragment中调用
1.实现接口。

public class DeviceSelectFragment extends Fragment implements MyListView.LoadListener

2.初始化

mLvDevice.setInterface(this);

3.实现上拉和下拉

@Override
    public void onLoad() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载完毕
                mLvDevice.loadComplete();

            }
        },3000);
    }

    @Override
    public void pullLoad() {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //加载完毕
                mLvDevice.loadComplete();

            }
        },3000);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值