Android-刷新之一:SwipeRefreshLayout
来源:互联网 发布:linux scp拷贝文件 编辑:程序博客网 时间:2024/06/17 00:51
介绍之前,先来看一下SwipeRefreshLayout实现的下拉刷新效果图。从图中可以看到,①下拉到了一定的高度才会进行刷新,高度不够就会回收上去,②正在刷新过程中,继续下拉没反应,说明刷新时屏蔽掉了下拉事件。
类的关系:
package android.support.v4.widget; //v4包public class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent, NestedScrollingChild { ...}
一、SwipeRefreshLayout简单介绍
先看以下Google官方文档,已有了很详细的描述了。
在竖直滑动时想要刷新页面可以用SwipeRefreshLayout来实现。它通过设置OnRefreshListener来监听界面的滑动从而实现刷新。也可以通过一些方法来设置SwipeRefreshLayout是否可以刷新。如:setRefreshing(true),展开刷新动画。
setRefreshing(false),取消刷新动画。setEnable(true)下拉刷新将不可用。
使用这个布局要想达到刷新的目的,需要在这个布局里包裹可以滑动的子控件,如ListView等,并且只能有一个子控件。
介绍总结:使用SwipeRefreshLayout可以实现下拉刷新,前提是布局里需要包裹一个可以滑动的子控件,然后在代码里设置OnRefreshListener设置监听,最后在监听里设置刷新时的数据获取就可以了。由于是新出来的东西,所以要想使用,先把support library的版本升级到19.1或更新。使用谷歌官方的下拉刷新组件SwipeRefreshLayout,只有下拉刷新功能。
二、SwipeRefreshLayout主要方法介绍
翻看官方的文档,可以看到方法有很多,这里只介绍五个经常用到的方法。
isRefreshing()
setColorSchemeResources(int… colorResIds)
设置下拉进度条的颜色主题,参数为可变参数,并且是资源id,最多可以设置四种不同的颜色,每转一圈就显示一种颜色。
setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)
设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现请求数据的逻辑,设置下拉进度条消失等等。
setProgressBackgroundColorSchemeResource(int colorRes)
setRefreshing(boolean refreshing)
设置刷新状态,true表示正在刷新,false表示取消刷新。
三、SwipeRefreshLayout的基本使用
3.1 设置布局
官方文档已经说明,SwipeRefreshLayout只能有一个孩子,当然我们不般也不会往里面放其他的布局。我们只需要在容器里包裹一个ListView就好了。
<!--使用谷歌官方的下拉刷新组件,只有下拉刷新功能--> <!-- <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/srl" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.SwipeRefreshLayout> -->
3.2 在代码中使用
在该布局文件对应的Activity或其他类中获取布局id,先设置ListView显示的适配器,然后再设置SwipeRefreshLayout。
// 不能在onCreate中设置,这个表示当前是刷新状态,如果一进来就是刷新状态,SwipeRefreshLayout会屏蔽掉下拉事件 //swipeRefreshLayout.setRefreshing(true); // 设置颜色属性的时候一定要注意是引用了资源文件还是直接设置16进制的颜色,因为都是int值容易搞混 // 设置下拉进度的背景颜色,默认就是白色的 swipeRefreshView.setProgressBackgroundColorSchemeResource(android.R.color.white); // 设置下拉进度的主题颜色 swipeRefreshView.setColorSchemeResources(R.color.colorAccent, R.color.colorPrimary, R.color.colorPrimaryDark); // 下拉时触发SwipeRefreshLayout的下拉动画,动画完毕之后就会回调这个方法 swipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 开始刷新,设置当前为刷新状态 //swipeRefreshLayout.setRefreshing(true); // 这里是主线程 // 一些比较耗时的操作,比如联网获取数据,需要放到子线程去执行 // TODO 获取数据 final Random random = new Random(); new Handler().postDelayed(new Runnable() { @Override public void run() { mList.add(0, "我是天才" + random.nextInt(100) + "号"); mAdapter.notifyDataSetChanged(); Toast.makeText(MainActivity.this, "刷新了一条数据", Toast.LENGTH_SHORT).show(); // 加载完数据设置为不刷新状态,将下拉进度收起来 swipeRefreshView.setRefreshing(false); } }, 1200); // System.out.println(Thread.currentThread().getName()); // 这个不能写在外边,不然会直接收起来 //swipeRefreshLayout.setRefreshing(false); } });
经过以上两步简单的设置就能使用SwipeRefreshLayout了。
由于谷歌并没有提供上拉加载更多的布局,所以我们只能自己去定义布局实现这个功能。
demo演示:
布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> <ProgressBar android:id="@+id/progressBar" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <ImageButton android:id="@+id/btnBack" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_margin="@dimen/btnBackMargin" android:src="@mipmap/ic_launcher" /></RelativeLayout>
Java代码:
package com.example.administrator.myapplication;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;import android.support.annotation.Nullable;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.ImageButton;import android.widget.ListView;import android.widget.ProgressBar;import android.widget.SimpleAdapter;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;/** * Created by Administrator on 2017/5/10. */public class MAinActivityI extends AppCompatActivity { private SwipeRefreshLayout swipeRefreshLayout; private ListView listView; private ProgressBar progressBar; private ImageButton btnBack; private List<Map<String, String>> data; private Handler handler = new Handler(); private SimpleAdapter adapter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maini); findViews(); initData(); initSwipeRefresh(); initBtnBack(); } private void initSwipeRefresh() { swipeRefreshLayout.setColorSchemeColors(Color.RED, Color.GREEN, Color.BLUE); //可以添加多个 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { progressBar.setVisibility(View.VISIBLE); handler.postDelayed(new Runnable() { @Override public void run() { updateData(true); } }, 3000); // 3秒后发送消息,停止刷新 } }); } private void updateData(boolean addToTop) { HashMap<String, String> map = new HashMap<>(); if (addToTop) { map.put("key", "im added head"); ((LinkedList) data).addFirst(map); } else { map.put("key", "im added tail"); ((LinkedList) data).addLast(map); } adapter.notifyDataSetChanged(); progressBar.setVisibility(View.GONE); swipeRefreshLayout.setRefreshing(false);//停止刷新 } private void initBtnBack() { btnBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listView.setSelection(0); } }); } private void findViews() { swipeRefreshLayout = ((SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout)); listView = ((ListView) findViewById(R.id.listView)); progressBar = ((ProgressBar) findViewById(R.id.progressBar)); btnBack = ((ImageButton) findViewById(R.id.btnBack)); progressBar.setVisibility(View.GONE); } private void initData() { data = new LinkedList<>(); for (int i = 0; i < 20; i++) { HashMap<String, String> map = new HashMap<>(); map.put("key", "im item " + i); data.add(map); } adapter = new SimpleAdapter(this, data, android.R.layout.simple_list_item_1, new String[]{"key"}, new int[]{android.R.id.text1}); listView.setAdapter(adapter); }}
参考:
SwipeRefreshLayout 详解和自定义上拉加载更多
下拉刷新上拉加载(SwipeRefreshLayout + recyclerView)
推荐(Android)五分钟让你轻松学会下拉刷新和上拉加载更多
- Android-刷新之一:SwipeRefreshLayout
- Android下拉刷新-SwipeRefreshLayout
- Android下拉刷新SwipeRefreshLayout
- Android 下拉刷新SwipeRefreshLayout
- Android SwipeRefreshLayout 刷新控件
- Android SwipeRefreshLayout下拉刷新
- Android 下拉刷新控件 SwipeRefreshLayout
- Android 下拉刷新控件SwipeRefreshLayout
- android SwipeRefreshLayout下拉刷新实现
- android下拉刷新之SwipeRefreshLayout
- Android--SwipeRefreshLayout下拉刷新Demo
- Android 6.0下拉刷新,SwipeRefreshLayout
- Android 下拉刷新控件SwipeRefreshLayout
- Android原生下拉刷新SwipeRefreshLayout
- #Android学习#下拉刷新SwipeRefreshLayout
- android 控件 下拉刷新 SwipeRefreshLayout
- android使用SwipeRefreshLayout下拉刷新
- Android 下拉刷新控件SwipeRefreshLayout
- Android-Widget桌面应用小部件
- 2016年湖南省第十二届大学生计算机程序设计竞赛:B—有向无环图
- 12集纪录片《人工智能真的来了》
- python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while
- 点击事件的4种写法
- Android-刷新之一:SwipeRefreshLayout
- C++重载
- 0009、node 之密码加密
- 加密解密(二)--Java中的对称加密算法
- X64 函数调用的一些问题
- eclipse中配置反编译工具JadClipse
- Ansible
- es6 新增部分
- Bootstrap fileinput.js,最好用的文件上传组件