SwipeRefreshLayout实现上拉下拉刷新
时间:2022-04-26
本文章向大家介绍SwipeRefreshLayout实现上拉下拉刷新,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1:在布局中添加SwipeRefreshLayout和Listview组件
[html] view plain copy
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
style="@style/BaseStyle.White"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--下拉刷新-->
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/srl_refresh"
style="@style/BaseStyle">
<!--上拉更多-->
<ListView
android:id="@+id/lv_person_goods"
style="@style/BaseStyle"
android:gravity="center"
android:horizontalSpacing="@dimen/margin_standard"
android:numColumns="2"
android:scrollbarStyle="outsideOverlay"
android:verticalSpacing="@dimen/margin_standard"/>
</android.support.v4.widget.SwipeRefreshLayout>
<!--数据为空时显示的View-->
<TextView
android:id="@+id/tv_no_data"
style="@style/BaseStyle.FullWrap"
android:layout_marginTop="@dimen/textview_width_small"
android:gravity="center_horizontal"
android:text="暂无数据"
android:textColor="@color/text_title_standard"
android:textSize="@dimen/font_size_small"
android:visibility="gone"/>
</RelativeLayout>
2:在主页面使用
[java] view plain copy
/**
* Created by pengkv on 2014/12/5.
* 我的宝贝列表页面,用于选择添加到拍卖场
*/
public class MySaleGoodsListViewActivity extends VolleyActivity implements IInit, IResponseHandler, IPagination, SwipeRefreshLayout.OnRefreshListener {
private int auctionID;
private GoodsInfoViewModel mViewModel;
private TextView mEmptyTV;//空白视图
private ListView mListView;//专场列表
private PersonGoodsListAdapter mAdapter;//适配器
private SwipeRefreshLayout mSwipeRefreshLayout;//下拉刷新布局
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_me_auction_goods_list);
init();
}
@Override
public void init() {
ActionBarUtil.setup(this, "我店铺的宝贝");
auctionID = getIntent().getIntExtra(EnumIntentKey.AUCTION_ID.toString(), 0);
mListView = (ListView) findViewById(R.id.lv_person_goods);
mEmptyTV = (TextView) findViewById(R.id.tv_no_data);
mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl_refresh);//下拉刷新组件
mSwipeRefreshLayout.setOnRefreshListener(this);//设置刷新监听器
mSwipeRefreshLayout.setColorSchemeResources(R.color.background_blue_standard, R.color.white, R.color.background_blue_standard, R.color.white);//设置下拉刷新组件的颜色
mViewModel = new GoodsInfoViewModel();
fetchData(FIRST);//得到喜欢列表数据
}
@Override
public void fetchData(int tag) {
GetGoodsListForSellParam param = new GetGoodsListForSellParam(Data.getUserID(), 1, mViewModel.getPageIndex(), Data.PAGE_SIZE_MEDIUM);
SquareApi.getGoodsListForSell(this, param, tag);
}
/**
* 更新适配器
*/
@Override
protected void onRestart() {
super.onRestart();
mViewModel.reset();
fetchData(FIRST);//得到喜欢列表数据
}
@Override
public void updateUI(Object response, final int tag) {
if (response == null) return;
if (tag == FIRST) {
//得到喜欢列表数据
mViewModel.inflate(response);
//通过判断喜欢列表适配器mAdapter是否为空来做分页处理
if (mAdapter == null) {
//当适配器为空
mSwipeRefreshLayout.setRefreshing(false);//下拉刷新组件停止刷新
mAdapter = new PersonGoodsListAdapter(this, mViewModel.getList());
mListView.setAdapter(mAdapter);//ListView绑定喜欢适配器
/**
* 上拉更多
*/
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
if (mListView.getLastVisiblePosition() == mViewModel.getList().size() - 1) {
if (!mViewModel.isComplete()) {
fetchNewData(FIRST);
}
}
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
mListView.setEmptyView(mEmptyTV);//将此图片绑定到喜欢列表ListView
} else {
mAdapter.notifyDataSetChanged();//适配器更新数据
}
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent i = new Intent();
if (getIntent().getBooleanExtra(EnumIntentKey.IS_SELECT_LINK.toString(), false)) { // 选择发送链接
i.putExtra(EnumIntentKey.GOODS_ID.toString(), mViewModel.getList().get(position).getGoodsID());
i.putExtra(EnumIntentKey.GOODS_NAME.toString(), mViewModel.getList().get(position).getGoodsName());
setResult(RESULT_OK, i);
} else { // 添加到专场
i.setClass(MySaleGoodsListViewActivity.this, AddAuctionGoodsActivity.class);
i.putExtra(EnumIntentKey.AUCTION_GOODS_ID.toString(), mViewModel.getList().get(position).getGoodsID());
i.putExtra(EnumIntentKey.IS_DO.toString(), true);
i.putExtra(EnumIntentKey.AUCTION_ID.toString(), auctionID);
startActivity(i);
}
finish();
}
});
}
}
@Override
public void fetchNewData(int tag) {
mViewModel.increasePageIndex();
fetchData(FIRST);//得到喜欢的拍品列表数据
}
@Override
public void onRefresh() {
mViewModel.reset();//重置页索引和完成状态
mAdapter = null;//清空适配器
fetchData(FIRST);//得到喜欢的拍品列表数据
}
}
解析:
(下拉刷新)主页面需要实现SwipeRefreshLayout.OnRefreshListener接口,然后在
[java] view plain copy
- @Override
- public void onRefresh() {
- }
方法中实现更新
(上拉更多)上拉更多需要监听setOnScrollListener()方法
[java] view plain copy
mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case SCROLL_STATE_IDLE:
if (mListView.getLastVisiblePosition() == mViewModel.getList().size() - 1) {
if (!mViewModel.isComplete()) {
fetchNewData(FIRST);
}
}
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
- 微信快速开发框架(六)-- 微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github
- 数据结构之数组
- Android资源动态加载以及相关原理分析
- 微信快速开发框架(七)--发送客服信息,版本更新至V2.2 代码已更新至github
- 微信快速开发框架(八)-- V2.3--增加语音识别及网页获取用户信息,代码已更新至Github
- 微信公众平台快速开发框架 For Core 2.0 beta –JCSoft.WX.Core 5.2.0 beta发布
- Android系统层Watchdog机制源码分析
- 算法之插入排序
- Android Studio环境下搭建ReactNative
- Android实现两个ScrollView互相联动,同步滚动的效果
- 一个可以拖动的自定义Gridview代码
- android图片加载库Glide
- 密码最短长度为7,其中必须包含以下非字母数字字符1 完美解决方案
- android开发性能分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 《JavaScript 模式》读书笔记(8)— DOM和浏览器模式2
- 5000字 | 24张图带你彻底理解21种并发锁
- JavaScript-变量
- Android应用安装卸载监控
- 细数这些年被困扰过的 TS 问题
- 将WordPress插件Elementor标签插入到WordPress模板文件以使用Elementor编辑
- WordPress自定义新建多区域widget小工具调用
- WordPress调用分类目录 及输出当前分类下的二级目录 和分类文章数量显示
- CSS让Li标签溢出后自动换行
- docker里运行docker命令
- 一次性实战java8 新特性(全)—— Lambda、Optional、stream、DateTime
- 面试Python高频问题汇总
- python自学成才之路 miniconda创建虚拟环境
- 逐行阅读Spring5.X源码(一) BeanDefinition,起点
- linux 磁盘占满 查看占用