`
苗振忠
  • 浏览: 56638 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

下拉刷新实现步骤分析及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());
        }
    }
分享到:
评论

相关推荐

    IOS下拉刷新Demo实现

    本教程将介绍如何使用EGOTableViewPullRefresh开源库在iOS应用中实现下拉刷新功能,并针对原代码进行一些自定义以支持中英文显示和调整刷新时间格式。 首先,EGOTableViewPullRefresh是由Egor Gorin开发的一个轻量...

    下拉刷新的实现

    **实现步骤:** 1. **引入依赖**:在你的`build.gradle`文件中,确保已经引入了`appcompat-v7`库,它包含了`SwipeRefreshLayout`。 ```gradle dependencies { implementation 'com.android.support:appcompat-v7:...

    ScrollView实现下拉刷新

    为了实现下拉刷新,开发者通常需要以下步骤: 1. **添加依赖**:将提取后的代码库集成到项目中,这可能通过添加Git子模块、复制相关源码到项目目录或者通过依赖管理工具(如Gradle)导入库的精简版本。 2. **创建...

    android 下拉刷新实现原理

    实现步骤 1. 设计一个抽象的接口 IPullToRefresh,它接受 View 的派生类,因为要放到我们的容器中的不就是一个 View 吗? 2. 实现 PullToRefreshBase&lt;T extends View&gt; 类,它是从 LinearLayout 继承过来,作为下拉...

    5种uni-app 页面下拉刷新方法-源码示例.zip

    本资料"5种uni-app 页面下拉刷新方法-源码示例.zip"提供了五种不同的实现方式,让我们详细探讨这些方法。 1. **基础API使用:uni.startPullDownRefresh()** uni-app提供了一个名为`uni.startPullDownRefresh()`的...

    scroller实现下拉刷新

    三、实现下拉刷新的步骤 1. 创建Header View:设计一个包含刷新指示器的布局,如旋转的菊花图标。 2. 自定义ListView或ScrollView:继承原生组件,重写onInterceptTouchEvent()和onTouchEvent()方法,以捕获滑动手势...

    android 有阻尼下拉刷新列表的实现方法

    Android 阻尼下拉刷新列表的实现方法可以分为以下几个步骤: 1. 首先,我们需要获取 PullToRefreshListView 的实例。 2. 然后,我们需要设置 OnLoadCallBack 回调来实现下拉刷新的逻辑。 3. 在 OnLoadCallBack 回...

    几种方法实现下拉刷新,上拉加载

    本篇将详细讲解如何使用Android Studio实现这三种不同的下拉刷新和上拉加载功能:ListView、RecyclerView以及SwipeRefreshLayout。 1. **ListView的下拉刷新和上拉加载** - **下拉刷新**: 可以通过集成...

    ios下拉刷新功能实现

    在iOS开发中,下拉刷新(Pull-...总结,iOS下拉刷新功能的实现可以通过使用苹果的UIRefreshControl,自定义视图,或者借助第三方库来完成。理解其工作原理和注意事项,能够帮助开发者创建更流畅、用户体验更好的应用。

    仿QQ下拉刷新

    【仿QQ下拉刷新】是一种常见的移动应用交互设计,它让用户在顶部下拉时触发页面内容的刷新。这种设计在QQ等社交应用中被广泛采用,后来成为了许多Android和iOS应用的标准特性。实现这一功能主要涉及到滚动视图、动画...

    Android 开源的下拉刷新 Eclipse版本

    在这个开源项目中,它可能包含了如何使用这些下拉刷新组件的示例代码,帮助开发者了解如何在自己的应用中集成和使用这些组件。 七、集成和使用 在Eclipse中,开发者需要将提供的库导入到项目中,然后在需要下拉刷新...

    自定义listview下拉刷新上拉加载更多以及与google官方的下拉刷新结合使用

    本教程将探讨如何自定义ListView实现下拉刷新和上拉加载更多,并将其与Google官方的SwipeRefreshLayout结合使用。 首先,我们要理解下拉刷新和上拉加载更多的基本概念。下拉刷新是指用户在ListView顶部向下拉动时,...

    Activity实现下拉刷新

    综上所述,实现Activity的下拉刷新涉及多个步骤,包括集成SwipeRefreshLayout、设置监听器、处理数据刷新逻辑以及可能的自定义实现。理解这些知识点对于开发高性能、用户友好的Android应用至关重要。

    下拉刷新实现

    本文将详细介绍如何在Android平台上实现下拉刷新功能。 一、下拉刷新基础概念 下拉刷新是一种用户体验设计模式,主要用于动态数据流的应用场景,如新闻、邮件等。当用户下拉界面时,会触发刷新操作,加载新的内容...

    仿网易下拉刷新

    通过以上步骤,开发者可以实现一个类似网易新闻客户端的下拉刷新功能,提供给用户一个直观、流畅的刷新体验。在实际开发中,可以根据项目需求进行调整和定制,以满足不同的交互设计和业务逻辑。

    仿美团下拉刷新

    四、实现步骤 1. 引入库:根据选择的库,将相应的依赖添加到项目中。 2. 创建布局:在XML布局文件中,将SwipeRefreshLayout作为根视图,然后将需要刷新的视图(如ListView、RecyclerView等)作为其子视图。 3. 设置...

    今日头条首页下拉刷新实现含案例

    本文将详细讲解下拉刷新的原理、实现方式,并结合“今日头条首页下拉刷新”的案例进行分析。 首先,下拉刷新的基本工作原理是:当用户在列表顶部向下拖动时,会触发一个事件,这个事件会调用后台的数据更新接口,...

    简单上拉加载下拉刷新实现

    "pullterrefersh.docx"可能是关于下拉刷新的详细说明,可能包含如何集成和自定义下拉刷新效果的步骤。 "xListView.rar"和"wk620pulltorefersh.zip"可能包含了XListView库的源码或者示例项目,供开发者参考学习。 ...

    自定义ListView实现下拉刷新+加载更多功能Demo

    在Android开发中,自定义ListView实现下拉刷新和加载更多的功能是常见的需求,尤其是在构建具有数据流滚动和实时更新的应用程序时。这个"自定义ListView实现下拉刷新+加载更多功能Demo"旨在帮助开发者理解如何集成...

Global site tag (gtag.js) - Google Analytics