今天在codepath 上看到一个开源项目 [点击查看]使用到了 SwipeRefreshLayout 实现了下拉刷新,但演示样例并不完整,于是自己就动手写了下.之前看到郭霖的博客上也有介绍下拉刷新,只是他是纯手动实现的,代码量大,较为繁琐.[点击查看]而使用Android
提供的SwipeRefreshLayout 则大大降低了我们的工作量,当然,学会了使用SwipeRefreshLayout之后还是建议去看看如何不借助SwipeRefreshLayout从零開始实现"下拉刷新".

SwipeRefreshLayout is a ViewGroup that can hold only one scrollable
view as a child. This can be either a ScrollView or anAdapterView such
as a ListView.

Note: This layout only exists within more recent versions of support-v4 as explained in this
post
. Edit your app/build.gradlefile to include a support library later than version 19:

要注意的是 SwipeRefreshLayout 在 Android 4.4.2(API 19) 的版本号才得到支持,因此在建project的时候最低版本号要选 19 之后的.

先看效果:

接下来我就直接上代码了. [当中用到的图片能够下载源代码,图片均包括在里面]

布局文件(XML)[activity_main.xml]:

里面就一个ListView,也不要有其它多余的东西

<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"> <ListView
android:layout_marginTop="30dp"
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView> </android.support.v4.widget.SwipeRefreshLayout>

MainActivity 代码:

package com.demo.mummyding.learnswiperefreshlayout;

import android.app.Activity;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast; import org.json.JSONArray; import java.util.ArrayList;
import java.util.List; /**
* 这里要实现 OnRefreshListener 接口
*/
public class MainActivity extends Activity implements SwipeRefreshLayout.OnRefreshListener{
private SwipeRefreshLayout swipeContainer;
ListView listView;
List<viewItem> list;
itemAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
} /**
* 下来刷新就会触发运行此方法
*/
@Override
public void onRefresh() {
/**
* 用Handler().postDelayed 延迟运行
* 当然,不用延迟也能够,我这里是为了看效果,由于这里刷新哗的一下就没了~
*/
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
list.clear();
addItems();
adapter.notifyDataSetChanged();
swipeContainer.setRefreshing(false);
}
}, 1000); /*
不用延迟能够直接像以下这样写
*/
/*
* list.clear();
addItems();
adapter.notifyDataSetChanged();
swipeContainer.setRefreshing(false);
*/
} /**
* 初始化变量&加入事件监听
*/
void init(){
listView = (ListView) findViewById(R.id.list_view);
swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
swipeContainer.setOnRefreshListener(this);
list = new ArrayList<viewItem>();
adapter = new itemAdapter(this,R.layout.view_layout,list);
listView.setAdapter(adapter);
} /**
* 向ListView加入Item 以下的Item 能够多复制几遍~_~
*/
void addItems(){
viewItem addItem = new viewItem("Aaron");
list.add(addItem);
addItem = new viewItem("Barton");
list.add(addItem);
addItem = new viewItem("Beacher");
list.add(addItem);
addItem = new viewItem("Colbert");
list.add(addItem);
addItem = new viewItem("Dick");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem);
addItem = new viewItem("Gregary");
list.add(addItem);
addItem = new viewItem("Francis");
list.add(addItem);
addItem = new viewItem("Fitch");
list.add(addItem);
addItem = new viewItem("Gordon");
list.add(addItem);
addItem = new viewItem("Eugene");
list.add(addItem); } }

接下来是两个类 Item类 和Adapter类[这就属于ListView的的基本使用方法了] 里面做了优化

package com.demo.mummyding.learnswiperefreshlayout;

/**
* Created by mummyding on 15-7-20.
*/
public class viewItem {
private String itemName; public String getItemName() {
return itemName;
} public viewItem(String itemName) {
this.itemName = itemName;
}
}
package com.demo.mummyding.learnswiperefreshlayout;

import android.content.Context;
import android.text.Layout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView; import java.util.List; /**
* Created by mummyding on 15-7-20.
*/
public class itemAdapter extends ArrayAdapter<viewItem> { public itemAdapter(Context context, int resource, List<viewItem> objects) {
super(context, resource, objects);
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
viewItem item = getItem(position);
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(R.layout.view_layout, null);
viewHolder = new ViewHolder();
viewHolder.name = (TextView) view.findViewById(R.id.tv_Name);
viewHolder.name.setText(item.getItemName());
view.setTag(viewHolder);
}else{
view = convertView;
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.name.setText(item.getItemName());
} return view;
} /**
* 为了降低getView方法中 findViewById 调用次数 而加入的一个辅助类.
*/
class ViewHolder{
TextView name;
}
}

最后另一个Item View的局部文件[view_layout.xml]

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv_Uers"
android:layout_width="60dp"
android:layout_height="50dp"
android:layout_marginLeft="10dp"
android:background="@drawable/user"
/>
<TextView
android:id="@+id/tv_Name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/iv_Uers"
android:gravity="center"
android:layout_centerInParent="true"
/>
</RelativeLayout> </LinearLayout>

完整代码:https://github.com/MummyDing/SwipeRefreshLayout

【转载请注明出处】

Author: MummyDing

出处:http://blog.csdn.net/mummyding/article/category/5651761

【Android】使用 SwipeRefreshLayout 实现下拉刷新的更多相关文章

  1. Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离

    SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTr ...

  2. RecyclerViewLoadMoreDemo【封装上拉加载功能的RecyclerView,搭配SwipeRefreshLayout实现下拉刷新】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装含有上拉加载功能的RecyclerView,然后搭配SwipeRefreshLayout实现下拉刷新.上拉加载功能. 在项目中将 ...

  3. 利用Swiperefreshlayout实现下拉刷新功能的技术探讨

    在常见的APP中通常有着下拉页面从而达到刷新页面的功能,这种看似简单的功能有着花样繁多的实现方式.而利用Swiperefreshlayout实现下拉刷新功能则是其中比较简明扼要的一种. 一般来说,在竖 ...

  4. Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果

    前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...

  5. Android SwipeRefreshLayout 官方下拉刷新控件介绍

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...

  6. Android开发之使用SwipeRefreshLayout完成下拉刷新

    SwipeRefreshLayout是V4包下的一个组件,老版本的V4包不支持这个组件功能.因此,如果发现自己的项目中无法导入SwipeRefreshLayout的包,那么说明项目中的V4包是老版本的 ...

  7. Android如何定制一个下拉刷新,上滑加载更多的容器

    前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...

  8. RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载

    前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ...

  9. Android实现RecyclerView的下拉刷新和上拉载入很多其它

    需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...

随机推荐

  1. 【原】jq简易教程

    https://www.jianshu.com/p/3522fe70de19 https://www.jianshu.com/p/6de3cfdbdb0e 1. jq简介 jq可以对json数据进行分 ...

  2. CocoaPods 命令和使用

    CocoaPods 命令 pod init 在新建的项目根目录下运行该命令,为当前项目新建podfile文件. pod install 下载和配置 podfile里定义的项目依赖(不包括已经下载和配置 ...

  3. Sublime Text3 学习笔记

    注:以下记录自己的 Sublime Text3学习过程(持续更新中) 目录: 安装 下载文件 破解试用 插件安装 安装 Sublime Text 是一套跨平台的文本编辑器,支持基于Python的插件. ...

  4. 原生j获取元素的几种方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 集训第六周 M题

    Description   During the early stages of the Manhattan Project, the dangers of the new radioctive ma ...

  6. 【03】HTML head 头部分的标签说明 和 手机头部标签说明

    HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...

  7. 数据库SQL实战练习

    http://blog.csdn.net/iamyvette/article/details/77151925

  8. BNUOJ 5997 Fibonacci again and again

    Fibonacci again and again Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HD ...

  9. LaTex/Overleaf使用笔记

    1. 添加网页引用 @misc{ r1,   author = "Wikipedia",   title = "Binary decision diagram --- { ...

  10. noip模拟赛 集合

    分析:感觉像是贪心,再看数据范围这么大,肯定是贪心没错.但是要怎么贪呢?主要的思想是让每次往上加的数尽量多,肯定要先把0分裂,如果能正好一起跳到最终状态就好.举个例子:5,3,2,1,最大值比次大值大 ...