• 下拉刷新实现步骤分析及RefreshListView的使用步骤说明


    下拉刷新实现步骤分析


    1.自定义一个类RefreshListView继承ListView,必须重写带有两个参数的构造方法

    2.在构造方法中实例化下拉刷新空间,布局文件refresh_header.xml 自定义ProgressBar,实现红色的圈圈效果

    3.实现下拉刷新的效果的原理

    view.setPadding(0,-控件的高,0,0);//下拉刷新控件完全隐藏 view.setPadding(0,0,0,0);//下拉刷新控件完全显示 view.setPadding(0,控件的高,0,0);//下拉刷新控件2倍完全显示

    4.重写onTouchEvent()当手指在屏幕滑动的时候,下拉刷新空间动态隐藏和显示

    int padintTop = -控件的高 + (endY - start)

    view.setPadding(0,padintTop,0,0);//下拉刷新控件动态的隐藏和显示

    1.记录y轴上的起始坐标 startY

    2.重写onTouchEvent();在按下的时候记录startY

    3.在移动的时候记录 endY

    4.计算偏移量 int distanceY = endY - startY

    if(distanceY >0){

    int padintTop = -控件的高 + distanceY
    
    view.setPadding(0,padintTop,0,0);//下拉刷新控件动态的隐藏和显示
    

    }

    5.判断顶部轮播图部分是否完全显示-加载更多的bug 怎么判断是否完全显示呢? 当ListView在屏幕上的Y轴坐标小于或者等于顶部轮播图在Y轴的坐标的时候,顶部轮播图完全显示了

    在屏幕上移动的时候

    //顶部轮播都没有完全显示,你下拉刷新控件就不需要显示 boolean isDisplayTopNews = isDisplayTopNews();

    if(!isDisplayTopNews){

    break;
    

    }

    addView 添加一个子View

    addHeaderView 在ListView中添加一个头部

    6.刷新状态切换的实现

    /** 下拉刷新状态 */ public static final int PULLDOWNREFRESH = 0;

    /**
     手松刷新状态
     */
    public static final int RELEASE_REFRESH = 1;
    
    
    /**
     正在刷新状态
     */
    public static final int REFRESHING = 2;
    
    private int currentStatus = PULL_DOWN_REFRESH;
    

    设置旋转动画

     /**
         * 初始化动画
         */
        private void initAnimation() {
            upAnimation = new RotateAnimation(0, -180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            upAnimation.setDuration(500);
            upAnimation.setFillAfter(true);
    
            donwnAnimation = new RotateAnimation(-180, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
            donwnAnimation.setDuration(500);
            donwnAnimation.setFillAfter(true);
    
    
        }
    

    更新状态

    private void refreshHeanderViewStatu() {
            switch (currentStatus) {
                case PULL_DOWN_REFRESH://下拉刷新
                    iv_header_refresh.startAnimation(donwnAnimation);
                    tv_header_status.setText("下拉刷新...");
                    break;
                case RELEASE_REFRESH:// 手松刷新
    
                    iv_header_refresh.startAnimation(upAnimation);
                    tv_header_status.setText("手松刷新...");
                    break;
                case REFRESHING: //正在刷新
    
                    iv_header_refresh.clearAnimation();
                    iv_header_refresh.setVisibility(View.GONE);//图片隐藏
                    tv_header_status.setText("正在刷新...");
                    pb_header_refresh.setVisibility(View.VISIBLE);
    
    
                    break;
    
            }
        }
    

    7.手指离开屏幕的处理,回调接口,联网请求

    public interface OnRefreshListener{

    /** 当下拉刷新的时候回调这个方法 */ public void onPullDownRefresh();

    }

    private OnRefreshListener mOnRefreshListener;

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

    定义接口 1.在哪里定义接口,哪个地方需要回调就在哪里定义 public interface OnClickListener { /** * Called when a view has been clicked. * * @param v The view that was clicked. */ void onClick(View v); } 2.如果调用结构-在View中

    public boolean callOnClick() { ListenerInfo li = mListenerInfo; if (li != null && li.mOnClickListener != null) { li.mOnClickListener.onClick(this); return true; } return false; }

    其实就是 void onClick(View v);被回调

    3.如何使用 -- 用户

    ivheaderrefresh.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //当点击的时候会被回调 } });

    8.当联网成功或者失败的时候,下拉刷新状态还原

    加载更多

    1.在构造方法里面初始化布局footerview.xml

    view.setPadding(0,-控件的高,0,0);//完全隐藏

    2.监听ListView的滚动,当滚动到最后一条的时候,加载更多

    3.新增加加载更多的方法

    public interface OnRefreshListener{

    /** 当下拉刷新的时候回调这个方法 */ public void onPullDownRefresh();

    /**

    当上拉,并且滑动的最后一条数据的时候,回调这个方法 */ public void onLoadMore();

    }

    4.调用接口 //回调接口 if (onRefreshListener != null) { onRefreshListener.onLoadMore(); }

    5.联网请求更多的数据,加载更多的请求的连接是一个新的了

    6.把新得到的数据,加载到原来的ArrayList 集合中

          isLoadMore = false;
            //加载更多
            news.addAll(detailPagerBean.getData().getNews());
            adapter.notifyDataSetChanged();//适配器刷新
    

    7.刷新,并且恢复初始状态

    isLoadMore = false; footView.setPadding(0,-footViewHeight,0,0);

    RefreshListView的使用步骤说明

    本库介绍:作者

    1.项目关联库

    2.布局中使用

    3.设置适配器

    案例代码

        package com.atguigu.refreshlistviewdemo;
    
        import android.app.Activity;
        import android.graphics.Color;
        import android.os.Bundle;
        import android.os.Handler;
        import android.os.Message;
        import android.os.SystemClock;
        import android.view.View;
        import android.view.ViewGroup;
        import android.widget.BaseAdapter;
        import android.widget.TextView;
    
        import com.atguigu.refreshlistview.RefreshListView;
    
        import java.text.SimpleDateFormat;
        import java.util.ArrayList;
        import java.util.Date;
    
        public class MainActivity extends Activity {
    
            private static final int PULL_DONW_REFRESH = 1;
            private static final int LOADMORE = 2;
            private RefreshListView refreshListView;
    
            private ArrayList<String> strings;
    
            private MyAdapter myAdapter;
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                refreshListView = (RefreshListView) findViewById(R.id.refreshListView);
    
                //准备数据
                strings = new ArrayList<>();
                for (int i = 0; i < 100; i++) {
                    strings.add(getsystemTime() + "-------" + i);
                }
    
                myAdapter = new MyAdapter();
                //设置适配器
                refreshListView.setAdapter(myAdapter);
    
    
                refreshListView.setOnRefreshListener(new RefreshListView.OnRefreshListener() {
                    @Override
                    public void onPullDownRefresh() {
    
                        getDataFromNet();
    
                    }
    
                    @Override
                    public void onLoadMore() {
                        getMoreData();
                    }
                });
    
    
            }
    
            private void getMoreData() {
    
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
    
                        //真正联网
                        SystemClock.sleep(2000);
                        for (int i = 0; i < 20; i++) {
                            strings.add(getsystemTime() + "---m----" + i);
                        }
    
    
                        handler.sendEmptyMessage(LOADMORE);
    
                    }
                }.start();
    
    
            }
    
            private Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
    
                    switch (msg.what) {
                        case PULL_DONW_REFRESH:
    
                            myAdapter.notifyDataSetChanged();
    
                            refreshListView.onFinishRefresh(true);
                            break;
    
                        case LOADMORE:
    
                            myAdapter.notifyDataSetChanged();
    
                            refreshListView.onFinishRefresh(true);
                            break;
                    }
                    super.handleMessage(msg);
    
                }
            };
    
            private void getDataFromNet() {
    
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
    
                        SystemClock.sleep(2000);
                        strings = new ArrayList<>();
                        for (int i = 0; i < 100; i++) {
                            strings.add(getsystemTime() + "---xxxxx----" + i);
                        }
    
                        handler.sendEmptyMessage(PULL_DONW_REFRESH);
    
                    }
                }.start();
    
    
            }
    
            class MyAdapter extends BaseAdapter {
    
                @Override
                public int getCount() {
                    return strings.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.setText(strings.get(position));
                    textView.setTextSize(30);
                    textView.setTextColor(Color.BLACK);
                    return textView;
                }
            }
    
            private String getsystemTime() {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return sdf.format(new Date());
            }
        }
  • 相关阅读:
    JavaWeb:ServletRequestListener
    JavaWeb:HttpServletRequestWrapper
    JavaWeb:Filter
    JavaWeb:HttpSession
    对APS的简单了解
    rem,px,em最大的区别;
    使用vue-cli构建工具构建vue项目时候组件的使用
    webpack 4.0 配置方法以及错误解决
    px,rem,em 通过媒体查询统一的代码
    关于页面中css某些情况下出现不知原因的隔断解决办法
  • 原文地址:https://www.cnblogs.com/miaozhenzhong/p/5930892.html
Copyright © 2020-2023  润新知