• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android SwipeRefreshLayout下拉刷新与上拉加载+滑动删除

Android SwipeRefreshLayout下拉刷新与上拉加载+滑动删除

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了androidswipelayout,android staticlayout,android linearlayout,android tablelayout,android layout等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android SwipeRefreshLayout下拉刷新与上拉加载+滑动删除


SwipeRefreshLayout–Google官方提出的下拉刷新控件,广泛应用在各种APP中。一直想弄一个既能支持下拉刷新,又能够上拉加载,同时还能实现类似于QQ的滑动删除效果。上网找了很多资料,最后达到了下面的效果:
这里写图片描述

 

接下来看看具体实现过程。

1.界面布局:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> <code class=" hljs avrasm"> <com.example.swiperefreshlayoutdemo.refreshlayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.swiperefreshlayoutdemo.qqlistview android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"> </com.example.swiperefreshlayoutdemo.qqlistview> </com.example.swiperefreshlayoutdemo.refreshlayout></code>

因为要实现上拉加载以及滑动删除,所以用的都是自定义的RefreshLayout以及Listview。
2.代码实现:

SwipeRefreshLayout的上拉加载实现有两种方法,一种是实现滑动监听,当滑动到底部时实现加载更多功能;一种是通过事件传递机制监听上拉动作,然后实现加载更多功能。先看第一种加载原理:

自定义的SwipeRefreshLayout:

//继承自SwipeRefreshLayout,从而实现滑动到底部时上拉加载更多的功能.

public class RefreshLayout extends SwipeRefreshLayout implements    OnScrollListener {

    // listview实例
    private ListView mListView;
    // 上拉接口监听器, 到了最底部的上拉加载操作
    private OnLoadListener mOnLoadListener;
    // ListView的加载中footer
    private View mListViewFooter;
    // 是否在加载中 ( 上拉加载更多 )
    private boolean isLoading = false;

    public RefreshLayout(Context context) {
        this(context, null);
    }

    public RefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //一个圆形进度条
        mListViewFooter = LayoutInflater.from(context).inflate(
                R.layout.listview_footer, null, false);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        // 初始化ListView对象
        if (mListView == null) {
            getListView();
        }
    }

    // 获取ListView对象
    private void getListView() {
        int childs = getChildCount();
        if (childs > 0) {
            View childView = getChildAt(0);
            if (childView instanceof ListView) {
                mListView = (ListView) childView;
                // 设置滚动监听器给ListView
                mListView.setOnScrollListener(this);
            }
        }
    }

    // 设置加载状态,添加或者移除加载更多圆形进度条
    public void setLoading(boolean loading) {
        isLoading = loading;
        if (isLoading) {
            mListView.addFooterView(mListViewFooter);
        } else {
            mListView.removeFooterView(mListViewFooter);

        }
    }

    //设置监听器
    public void setOnLoadListener(OnLoadListener loadListener) {
        mOnLoadListener = loadListener;
    }

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

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {

        // 判断是否到了最底部,并且不是在加载数据的状态
        if (mListView.getLastVisiblePosition() == mListView.getAdapter()
                .getCount() - 1 && isLoading == false) {
            // 首先设置加载状态
            setLoading(true);
            // 调用加载数据的方法
            mOnLoadListener.onLoad();

        }

    }

    // 加载更多的接口
    public interface OnLoadListener {
        public void onLoad();
    }
}

注释写的很清楚,实现滑动监听,然后初始化listview,写好加载任务接口与方法。在滑动监听方法里面,有几个参数注意一下:
firstVisibleItem 表示在当前屏幕显示的第一个listItem在整个listView里面的位置(下标从0开始)
visibleItemCount表示在现时屏幕可以见到的ListItem(部分显示的ListItem也算)总数
totalItemCount表示ListView的ListItem总数
listView.getLastVisiblePosition()表示在现时屏幕最后一个ListItem (最后ListItem要完全显示出来才算)在整个ListView的位置(下标从0开始)
刚开始只判断是否滑动到了最底部,没有对加载状态进行判断,导致程序运行崩溃,在最底部加载数据时会一直加载。后来加上判断,默认不加载数据,isLoading==false,滑动到最底部加载数据时,设置为true,当加载完成以后,设置为false,加载完毕。

接下来是第二种加载原理:

public class RefreshLayout extends SwipeRefreshLayout {

    // listview实例
    private ListView mListView;
    // 上拉接口监听器, 到了最底部的上拉加载操作
    private OnLoadListener mOnLoadListener;
    // ListView的加载中footer
    private View mListViewFooter;
    // 是否在加载中 ( 上拉加载更多 )
    private boolean isLoading = false;

    // 按下时的y坐标
    private int mYDown;
    // 抬起时的y坐标
    private int mLastY;
    // 滑动到最下面时的上拉操作
    private int mTouchSlop;

    public RefreshLayout(Context context) {
        this(context, null);
    }

    public RefreshLayout(Context context, AttributeSet attrs) {
        super(context, attrs);

        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
        mListViewFooter = LayoutInflater.from(context).inflate(
                R.layout.listview_footer, null, false);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        // 初始化ListView对象
        if (mListView == null) {
            getListView();
        }
    }

    // 获取ListView对象
    private void getListView() {
        int childs = getChildCount();
        if (childs > 0) {
            View childView = getChildAt(0);
            if (childView instanceof ListView) {
                mListView = (ListView) childView;
            }
        }
    }

    public boolean dispatchTouchEvent(MotionEvent event) {
        final int action = event.getAction();

        switch (action) {
        case MotionEvent.ACTION_DOWN:
            // 按下
            mYDown = (int) event.getRawY();
            break;

        case MotionEvent.ACTION_MOVE:
            // 移动
            mLastY = (int) event.getRawY();
            break;

        case MotionEvent.ACTION_UP:
            // 抬起
            if ((mYDown - mLastY) >= mTouchSlop && isLoading == false) {
                // 设置状态
                setLoading(true);
                //
                mOnLoadListener.onLoad();
            }
            break;
        default:
            break;
        }

        return super.dispatchTouchEvent(event);
    }

    // 设置加载状态
    public void setLoading(boolean loading) {
        isLoading = loading;
        if (isLoading) {
            mListView.addFooterView(mListViewFooter);
        } else {
            mListView.removeFooterView(mListViewFooter);

        }
    }

    // 设置监听器
    public void setOnLoadListener(OnLoadListener loadListener) {
        mOnLoadListener = loadListener;
    }

    // 加载更多的接口
    public interface OnLoadListener {
        public void onLoad();
    }
}

初始化数据都一样,不同的是记录了两个Y坐标,一个按下,一个抬起,用来判断滑动到底部时的上拉动作。getScaledTouchSlop是一个距离,表示滑动的时候,手的移动要大于这个距离才开始移动控件。如果小于这个

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • SwipeRefreshLayout下拉刷新,swiperefreshlayout
  • Android SwipeRefreshLayout下拉刷新与上拉加载+滑动删除
  • Android源码解析--SwipeMenuListView仿QQ聊天左滑

相关文章

  • 2017-07-23Android焦点事件分发与传递机制
  • 2017-05-26《Android权威编程指南(The Big Nerd Ranch Guide)(第二版)》12.4挑战练习,bignerdranch
  • 2017-05-26Android开发艺术探索学习笔记(三),android艺术探索
  • 2017-05-26读《重构手册》-重构之姊妹篇有感,《重构手册》姊妹篇
  • 2017-05-26零停重启程序工具Huptime研究
  • 2017-05-26对沉浸式状态栏的理解,沉浸式状态栏理解
  • 2017-05-26[转]File Descriptor泄漏导致Crash: Too many open files,descriptorcrash
  • 2017-05-26android http同步请求,android同步请求
  • 2017-05-26android开发之路02(浅谈BroadcastReceiver),broadcastreceiver
  • 2017-05-26Smack+OpenFire搭建IM通信,包含心跳和自动重连(Android实现),smackopenfire

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Android横竖屏切换小结,Android屏切换小结
    • Linux内核系列—10.操作系统开发之内核HelloWorld,linuxhelloworld
    • 手机影音1--SplashActivity,1--splashactivity
    • 总结一下Android中主题(Theme)的正确玩法,androidtheme
    • 2.6.1 PopupWindow(悬浮框)的基本使用
    • android:Activity数据传递之基本数据类型
    • Android数据存储之SQLite
    • Android触摸事件分发机制完全解析《一》
    • android studio我的习惯操作,androidstudio习惯
    • Android在onCreate()方法中可以获取到宽高等信息

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有