栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android ListView 下拉刷新demo

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android ListView 下拉刷新demo



简单的下拉list view 下拉刷新demo 直接复制即可



1.PullToRefreshListView.java 自定义 ListView 实现下拉刷新Java文件;

 

package com.example.myapplication666;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.recyclerview.widget.RecyclerView;

public class PullToRefreshListView extends ListView implements View.OnClickListener, AbsListView.OnScrollListener {
    
    private static final int PULL_TO_REFRESH = 1;   //下拉-默认为初始状态  准备下拉刷新
    private static final int RELEASE_TO_REFRESH = 2;   //释放刷新
    private static final int REFRESHING = 3;       //正在刷新

    private static final String TAG = "PullRefreshListView";

    private OnRefreshListener mOnRefreshListener;

    
    private OnScrollListener mOnScrollListener;

    //下拉刷新的的头部view
    private LinearLayout mRefreshView;
    private ImageView mRefreshViewImage;
    private ProgressBar mRefreshViewProgress;
    private TextView mRefreshViewText;
    private TextView mRefreshViewLastUpdated;


    private int mRefreshState;
    private int mCurrentScrollState;

    private RotateAnimation mFlipAnimation;
    private RotateAnimation mReverseFlipAnimation;

    private int mRefreshViewHeight;
    private int mRefreshOriginalTopPadding;
    private int mLastMotionY;

    public PullToRefreshListView(Context context) {
        super(context);
        init(context);
    }

    public PullToRefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    private void init(Context context) {
        mFlipAnimation = new RotateAnimation(0, -180,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        mFlipAnimation.setInterpolator(new LinearInterpolator());
        mFlipAnimation.setDuration(250);
        mFlipAnimation.setFillAfter(true);
        mReverseFlipAnimation = new RotateAnimation(-180, 0,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f,
                RotateAnimation.RELATIVE_TO_SELF, 0.5f);
        mReverseFlipAnimation.setInterpolator(new LinearInterpolator());
        mReverseFlipAnimation.setDuration(250);
        mReverseFlipAnimation.setFillAfter(true);

        mRefreshView = (LinearLayout) View.inflate(context, R.layout.pull_to_refresh_header, null);
        mRefreshViewText = (TextView) mRefreshView.findViewById(R.id.pull_to_refresh_text);
        mRefreshViewImage = (ImageView) mRefreshView.findViewById(R.id.pull_to_refresh_image);
        mRefreshViewProgress = (ProgressBar) mRefreshView.findViewById(R.id.pull_to_refresh_progress);
        mRefreshViewLastUpdated = (TextView) mRefreshView.findViewById(R.id.pull_to_refresh_updated_at);

        mRefreshState = PULL_TO_REFRESH;
        mRefreshViewImage.setMinimumHeight(50); //设置下拉最小的高度为50

        setFadingEdgeLength(0);
        setHeaderDividersEnabled(false);

        //把refreshview加入到listview的头部
        addHeaderView(mRefreshView);
        super.setOnScrollListener(this);
        mRefreshView.setOnClickListener(this);

        mRefreshView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
        mRefreshViewHeight = mRefreshView.getMeasuredHeight();
        mRefreshOriginalTopPadding = -mRefreshViewHeight;

        resetHeaderPadding();
    }

    
    @Override
    public void setOnScrollListener(OnScrollListener l) {
        mOnScrollListener = l;
    }

    
    public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
        mOnRefreshListener = onRefreshListener;
    }

    
    public void setLastUpdated(CharSequence lastUpdated) {
        if (lastUpdated != null) {
            mRefreshViewLastUpdated.setVisibility(View.VISIBLE);
            mRefreshViewLastUpdated.setText(lastUpdated);
        } else {
            mRefreshViewLastUpdated.setVisibility(View.GONE);
        }
    }

    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        final int y = (int) event.getY();
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastMotionY = y;
                break;
            case MotionEvent.ACTION_MOVE:
                int offsetY = (int) event.getY();
                int deltY = Math.round(offsetY - mLastMotionY);
                mLastMotionY = offsetY;

                if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
                    deltY = deltY / 2;
                    mRefreshOriginalTopPadding += deltY;
                    if (mRefreshOriginalTopPadding < -mRefreshViewHeight) {
                        mRefreshOriginalTopPadding = -mRefreshViewHeight;
                    }
                    resetHeaderPadding();
                }
                break;
            case MotionEvent.ACTION_UP:
                //当手指抬开得时候 进行判断下拉的距离 ,如果>=临界值,那么进行刷洗,否则回归原位
                if (!isVerticalScrollBarEnabled()) {
                    setVerticalScrollBarEnabled(true);
                }
                if (getFirstVisiblePosition() == 0 && mRefreshState != REFRESHING) {
                    if (mRefreshView.getBottom() >= mRefreshViewHeight
                            && mRefreshState == RELEASE_TO_REFRESH) {
                        //准备开始刷新
                        prepareForRefresh();
                    } else {
                        // Abort refresh
                        resetHeader();
                    }
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
                         int visibleItemCount, int totalItemCount) {
        if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL && mRefreshState != REFRESHING) {
            if (firstVisibleItem == 0) {
                if ((mRefreshView.getBottom() >= mRefreshViewHeight)
                        && mRefreshState != RELEASE_TO_REFRESH) {
                    mRefreshViewText.setText("松开加载");
                    mRefreshViewImage.clearAnimation();
                    mRefreshViewImage.startAnimation(mFlipAnimation);
                    mRefreshState = RELEASE_TO_REFRESH;
                } else if (mRefreshView.getBottom() < mRefreshViewHeight
                        && mRefreshState != PULL_TO_REFRESH) {
                     mRefreshViewText.setText("放弃加载");
                    mRefreshViewImage.clearAnimation();
                    mRefreshViewImage.startAnimation(mReverseFlipAnimation);
                    mRefreshState = PULL_TO_REFRESH;
                }
            }
        }

        if (mOnScrollListener != null) {
            mOnScrollListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
        }
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        mCurrentScrollState = scrollState;

        if (mOnScrollListener != null) {
            mOnScrollListener.onScrollStateChanged(view, scrollState);
        }
    }

    
    private void resetHeaderPadding() {
        mRefreshView.setPadding(
                mRefreshView.getPaddingLeft(),
                mRefreshOriginalTopPadding,
                mRefreshView.getPaddingRight(),
                mRefreshView.getPaddingBottom());
    }

    public void prepareForRefresh() {
        if (mRefreshState != REFRESHING) {
            mRefreshState = REFRESHING;

            mRefreshOriginalTopPadding = 0;
            resetHeaderPadding();

            mRefreshViewImage.clearAnimation();
            mRefreshViewImage.setVisibility(View.GONE);
            mRefreshViewProgress.setVisibility(View.VISIBLE);
            mRefreshViewText.setText("数据加载中");

            onRefresh();
        }
    }

    private void resetHeader() {
        mRefreshState = PULL_TO_REFRESH;

        mRefreshOriginalTopPadding = -mRefreshViewHeight;
        resetHeaderPadding();

        mRefreshViewImage.clearAnimation();
     //   mRefreshViewImage.setVisibility(View.VISIBLE);
        mRefreshViewProgress.setVisibility(View.GONE);
        mRefreshViewText.setText("下拉刷新");
    }

    
    public void onRefresh() {
        Log.d(TAG, "onRefresh");
        if (mOnRefreshListener != null) {
            mOnRefreshListener.onRefresh();
        }
    }

    
    public void onRefreshComplete() {
        Log.d(TAG, "onRefreshComplete");

        resetHeader();
    }

    @Override
    public void onClick(View v) {
        Log.d(TAG, "onClick");
    }

    
    public interface OnRefreshListener {
        
        public void onRefresh();
    }
}

2.pull_to_refresh_header.xml  下拉刷新功能布局文件;



    
        
            
            
        
        
        
    
    
3.MainActivity.java 主类 加载数据适配器显示自定义 ListView ;
import static java.lang.Thread.sleep;

import androidx.annotation.NonNull;
import androidx.annotation.UiThread;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        PullToRefreshListView p = findViewById(R.id.lv);
        String[] sp = {"1", "2", "3", "4", "5", "6", "7", "8", "9",};

        Myadapter myAdapter = new Myadapter(this, sp);

        p.setAdapter(myAdapter);

        //下拉后加载新数据回调
        p.setOnRefreshListener(new PullToRefreshListView.OnRefreshListener() {
            @Override
            public void onRefresh() {


                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        MainActivity.this.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {

                                //加载完成回调隐藏头布局
                                p.onRefreshComplete();
                                Toast.makeText(getApplicationContext(), "加载完成", Toast.LENGTH_SHORT).show();


                            }
                        });

                    }
                }).start();
            }
        });


    }
}

4.activity_main.xml 主类布局文件加载自定义 PullToRefreshListView;




    

5.Myadapter.java 适配器代码;
package com.example.myapplication666;

import static android.content.Context.MODE_PRIVATE;

import android.content.Context;
import android.content.SharedPreferences;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class Myadapter extends BaseAdapter {

    Context context;
    private String[] sp;
    SharedPreferences sharedPreferences;

    public Myadapter(Context context, String[] sp) {

        this.context = context;
        this.sp = sp;
        sharedPreferences = context.getSharedPreferences("sp", MODE_PRIVATE);

    }

    @Override
    public int getCount() {
        return sp.length;
    }

    @Override
    public Object getItem(int position) {
        return sp[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        Holder holder = null;
        if (convertView == null) {

            convertView = View.inflate(context, R.layout.layout, null);
            holder = new Holder();
            holder.name = convertView.findViewById(R.id.xs);
            convertView.setTag(holder);

        } else {

            holder = (Holder) convertView.getTag();

        }


        holder.name.setText(sp[position]);


        return convertView;
    }

    class Holder {

        TextView name;


    }
}

6.layout.xml listview item 布局文件;



    

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1039106.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号