【Android】使用 SwipeRefreshLayout 实现下拉刷新
今天在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.gradle
file 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
【Android】使用 SwipeRefreshLayout 实现下拉刷新的更多相关文章
- Android 编程下如何调整 SwipeRefreshLayout 的下拉刷新距离
SwipeRefreshLayout 的下拉刷新距离比较短,并且也没有提供设置下拉距离的 API,但是看 SwipeRefreshLayout 的源码,会发现有一个内部变量 mDistanceToTr ...
- RecyclerViewLoadMoreDemo【封装上拉加载功能的RecyclerView,搭配SwipeRefreshLayout实现下拉刷新】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装含有上拉加载功能的RecyclerView,然后搭配SwipeRefreshLayout实现下拉刷新.上拉加载功能. 在项目中将 ...
- 利用Swiperefreshlayout实现下拉刷新功能的技术探讨
在常见的APP中通常有着下拉页面从而达到刷新页面的功能,这种看似简单的功能有着花样繁多的实现方式.而利用Swiperefreshlayout实现下拉刷新功能则是其中比较简明扼要的一种. 一般来说,在竖 ...
- Android仿苹果版QQ下拉刷新实现(二) ——贝塞尔曲线开发"鼻涕"下拉粘连效果
前言 接着上一期Android仿苹果版QQ下拉刷新实现(一) ——打造简单平滑的通用下拉刷新控件 的博客开始,同样,在开始前我们先来看一下目标效果: 下面上一下本章需要实现的效果图: 大家看到这个效果 ...
- Android SwipeRefreshLayout 官方下拉刷新控件介绍
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24521483 下面App基本都有下拉刷新的功能,以前基本都使用XListView ...
- Android开发之使用SwipeRefreshLayout完成下拉刷新
SwipeRefreshLayout是V4包下的一个组件,老版本的V4包不支持这个组件功能.因此,如果发现自己的项目中无法导入SwipeRefreshLayout的包,那么说明项目中的V4包是老版本的 ...
- Android如何定制一个下拉刷新,上滑加载更多的容器
前言 下拉刷新和上滑加载更多,是一种比较常用的列表数据交互方式. android提供了原生的下拉刷新容器 SwipeRefreshLayout,可惜样式不能定制. 于是打算自己实现一个专用的.但是下拉 ...
- RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载
前段时间项目里面使用了RecycleView 但是里面的刷新和加载都是框架里面封装好的,直接使用 这几天比较闲就自己来实现以下. 因为SwipeRefreshLayout是一个下拉刷新控件所有直接和R ...
- Android实现RecyclerView的下拉刷新和上拉载入很多其它
需求 先上效果图, Material Design风格的下拉刷新和上拉载入很多其它. 源代码地址(欢迎star) https://github.com/studychen/SeeNewsV2 假设对于 ...
随机推荐
- 关于动态添加的html元素绑定的事件不生效的解决办法
1.可以通过行内添加事件的方法,比如onclick="fn()"; 在js中写好方法名对应的方法就可以了,如果绑定方法的元素太多 2.jquery的on事件绑定 //on事件可以给 ...
- 06网络通信udp-tcp、正则
一. udp网络程序 1. udp网络程序-发送数据 1)创建客户端套接字 2)发送/接收数据 3)关闭套接字 from socket import * # 1. 创建udp套接字 udp_so ...
- java中引用对比C++指针
前置知识地址:https://blog.csdn.net/wangfei8348/article/details/51383805 重点在后面的引用对比实验(测试出内存地址,我很开心哈哈哈,客观给个好 ...
- buf.toJSON()
buf.toJSON() 返回:{Object} 返回该 Buffer 实例的 JSON 表达式.当字符串化一个 Buffer 实例时会隐式调用 JSON.stringify() 这个函数. 例子: ...
- c# TcpClient简易聊天工具
说明: TcpClient 链接是一个比较安全稳定的链接,作为聊天或者是数据稳定传输,是比较合适的,下面的代码测试过,如果你吧他放在公网服务器上,也是可以用的 using System; using ...
- xtu summer individual 5 A - To Add or Not to Add
To Add or Not to Add Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeFo ...
- 概率dp呜呜
概率dp有环怎么办? 答案可劲迭代 ,然后可劲消元 , 怎么消? 我就不知道了. 呵呵
- android开发里跳过的坑——onActivityResult在启动另一个activity的时候马上回调
该问题是由于被启动的activity的launchMode为singleTask模式,该模式下不可以使用onActivityResult,要使用onActivityResult,被启动的activit ...
- [Nescafé 20] 玉蟾宫
★ 输入文件:jademoon.in 输出文件:jademoon.out 简单对比 时间限制:1 s 内存限制:128 MB [背景] 有一天,小猫rainbow和freda来到了湘西 ...
- 2.3 comparator(比较器)
1.comparator是java的一种机制,用来帮助我们给相同对象的不同属性排序 2.Comparable接口,是一个对象本身就已经支持自比较所需要实现的接口,如String,Integer自己就已 ...