刷新控件MaterialRefreshLayout
来源:互联网 发布:央视新闻下载软件 编辑:程序博客网 时间:2024/05/14 01:59
博主觉得这控件用起来还不错,推荐给大家。顺带记录一下,方便日后学习。此博文是结合网上多个博主的解读,综合性的一个转载博文。
MaterialRefreshLayout是一个非常完美的下拉刷新上拉加载控件,类似于LinearLayout。使用也很容易:
①加入依赖
compile 'com.cjj.materialrefeshlayout:library:1.3.0'
②在布局文件中加入MaterialLayout,其中放置RecyclerView
<com.cjj.MaterialRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:overlay="false"
app:wave_show="true"
app:wave_color="@color/material_green"
app:wave_height_type="normal"
>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/recycler_view_hot"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"/>
</com.cjj.MaterialRefreshLayout>
③实例化MaterialRefreshLayout和 RecyclerView
@ViewInject(R.id.recycler_view_hot)
private RecyclerView mRecyclerView;
@ViewInject(R.id.refresh)
private MaterialRefreshLayout materialRefreshLayout;
④获得数据,计算当前页,总页数和每页的数目,用于MaterialRefreshLayout进行分页处理
private int totlaPage = 1;
private int curPage = 1;
private int pageSize = 10;
private OkHttpHelper httpHelper = OkHttpHelper.getInstance();
private List<Wares> waresList = new ArrayList<>();
private void getData( ){
httpHelper.get(url, new SpotsCallBack<Page<Wares>>(getContext()) {
@Override
public void onSuccess(Response response, Page<Wares> waresPage) {
waresList = waresPage.getList();
curPage = waresPage.getCurrentPage();
pageSize = waresPage.getPageSize();
totlaPage = waresPage.getTotalPage();
showData();
}
@Override
public void onError(Response response, int code, Exception e) {
}
});
}
⑤RecyclerView显示数据,此时RecyclerView不知是按照之前的方式(设置适配器)来显示数据了,而是按照不同的状态来显示数据
private static final int STATE_NORMAL = 0;
private static final int STATE_REFREN = 1;
private static final int STATE_MORE = 2;
private int state = STATE_NORMAL;
private HotWaresAdapter hotWaresAdapter;
private void showData(){
switch (state){
case STATE_NORMAL:
hotWaresAdapter = new HotWaresAdapter(waresList);
mRecyclerView.setAdapter(hotWaresAdapter);
final LinearLayoutManager layoutManager =
new LinearLayoutManager(HotFragment.this.getActivity());
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mRecyclerView.addItemDecoration(
new DividerItemDecoration(HotFragment.this.getContext()
, DividerItemDecoration.HORIZONTAL_LIST));
break;
case STATE_REFREN:
hotWaresAdapter.clearData();
hotWaresAdapter.addData(waresList);
mRecyclerView.scrollToPosition(0);
materialRefreshLayout.finishRefresh();
break;
case STATE_MORE:
hotWaresAdapter.addData(hotWaresAdapter.getDatas().size(), waresList);
mRecyclerView.scrollToPosition(hotWaresAdapter.getDatas().size());
materialRefreshLayout.finishRefreshLoadMore();
break;
}
}
⑥为MaterialRefreshLayout添加监听器,来实现下拉刷新和上拉加载时的逻辑
private void initMaterialRefreshLayout(){
materialRefreshLayout.setLoadMore(true);
materialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
@Override
public void onRefresh(final MaterialRefreshLayout materialRefreshLayout) {
//refreshing...
refreshData();
}
@Override
public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
//load more refreshing...
if(curPage <= totlaPage)
loadMore();
else {
Toast.makeText(getContext(), "没有更多了...", Toast.LENGTH_LONG).show();
materialRefreshLayout.finishRefreshLoadMore();
}
}
});
}
public void refreshData(){
curPage = 1;
state = STATE_REFREN;
getData();
}
private void loadMore(){
curPage = curPage + 1;
state = STATE_MORE;
getData();
}
⑦适配器,用Fresco来加载图片
public class HotWaresAdapter extends RecyclerView.Adapter<HotWaresAdapter.ViewHolder> {
private List<Wares> mDatas;
private LayoutInflater mInflater;
public HotWaresAdapter(List<Wares> wares){
mDatas = wares;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
mInflater = LayoutInflater.from(parent.getContext());
View view = mInflater.inflate(R.layout.template_hot_wares,null);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Wares wares = getData(position);
holder.draweeView.setImageURI(Uri.parse(wares.getImgUrl()));
holder.textTitle.setText(wares.getName());
holder.textPrice.setText("¥"+wares.getPrice());
}
public Wares getData(int position){
return mDatas.get(position);
}
public List<Wares> getDatas(){
return mDatas;
}
public void clearData(){
mDatas.clear();
notifyItemRangeRemoved(0,mDatas.size());
}
public void addData(List<Wares> datas){
addData(0,datas);
}
public void addData(int position,List<Wares> datas){
if(datas !=null && datas.size()>0) {
mDatas.addAll(datas);
notifyItemRangeChanged(position, mDatas.size());
}
}
@Override
public int getItemCount() {
if(mDatas!=null && mDatas.size()>0)
return mDatas.size();
return 0;
}
class ViewHolder extends RecyclerView.ViewHolder{
SimpleDraweeView draweeView;
TextView textTitle;
TextView textPrice;
public ViewHolder(View itemView) {
super(itemView);
draweeView = (SimpleDraweeView) itemView.findViewById(R.id.drawee_view);
textTitle= (TextView) itemView.findViewById(R.id.text_title);
textPrice= (TextView) itemView.findViewById(R.id.text_price);
}
}
}
下面则是里面自定义属性的一些说明:
<?xml version="1.0" encoding="utf-8"?><resources> <!-- style for MaterialRefreshLayout --> <declare-styleable name="MaterialRefreshLayout"> <!--设置刷新是入侵式还是非入侵式--> <attr name="overlay" format="boolean"/> <!-- style for MaterialWaveView --> <!--设置波浪的高度--> <attr name="wave_height_type" format="enum"> <enum name="normal" value="0"/> <enum name="higher" value="1"/> </attr> <!--设置波浪的颜色--> <attr name="wave_color" format="color"/> <!--设置是否使用波浪效果--> <attr name="wave_show" format="boolean"/> <!-- style for CircleProgressBar --> <!--设置圆圈变换的颜色--> <attr name="progress_colors" format="reference"/> <!--暂不明确--> <attr name="progress_stoke_width" format="dimension"/> <!--设置圆圈的背景--> <attr name="progress_backgroud_color" format="color"/> <!--是否显示箭头--> <attr name="progress_show_arrow" format="boolean"/> <!--箭头宽度--> <attr name="progress_arrow_width" format="dimension"/> <!--箭头高度--> <attr name="progress_arrow_height" format="dimension"/> <!--是否显示圆圈的背景--> <attr name="progress_show_circle_backgroud" format="boolean"/> <!--设置文字进度--> <attr name="progress_value" format="integer"/> <!--设置文字进度的最大值--> <attr name="progress_max_value" format="integer"/> <!--设置文字大小--> <attr name="progress_text_size" format="dimension"/> <!--设置文字颜色--> <attr name="progress_text_color" format="color"/> <!--是否显示文字进度--> <attr name="progress_text_visibility" format="enum"> <enum name="visible" value="0"/> <enum name="invisible" value="1"/> </attr> <!--暂不明确--> <attr name="progress_size_type" format="enum"> <enum name="normal" value="0"></enum> <enum name="big" value="1"></enum> </attr> <!--是否加载更多--> <attr name="isLoadMore" format="boolean"></attr> </declare-styleable></resources>
3. 缺憾:
此框架使用起来很简单,也支持一些效果的设置,但是还是有一些缺憾:
(1)不支持自定义刷新样式,框架中只有两种样式,小圆圈跟一个小太阳,要使用其他样式估计要自己改框架了
(2)加载更多过度不够平滑,也不支持非入侵式。
demo地址(as):https://github.com/android-cjj/Android-MaterialRefreshLayout
- 刷新控件MaterialRefreshLayout
- materialdesign下拉刷新控件MaterialRefreshLayout的使用
- MaterialRefreshLayout v1.3.0 这是一个下拉刷新控件
- 学习笔记 Tianmao 篇 materialRefreshLayout 下拉刷新 控件的使用
- 上拉刷新下拉加载控件MaterialRefreshLayout的使用
- materialRefreshLayout 下拉刷新
- 下拉刷新上拉加载开源控件---MaterialRefreshLayout开源控件
- 下拉刷新?我看好MaterialRefreshLayout!
- SwipeRefreshLayout自定义刷新效果MaterialRefreshLayout
- MaterialRefreshLayout(下拉刷新和上拉加载)
- Android SwipeRefreshLayout自定义刷新效果MaterialRefreshLayout
- MaterialRefreshLayout(下拉刷新,上拉加载)
- MaterialRefreshLayout实现下拉刷新,下拉加载更多
- Material效果的下拉刷新MaterialRefreshLayout
- 下拉刷新上拉加载之MaterialRefreshLayout
- MaterialRefreshLayout实现下拉刷新上拉加载更多
- 用MaterialRefreshLayout实现下拉刷新 上拉加载更多
- MaterialRefreshLayout下拉刷新,上拉加载更多(修改)
- GITHUB使用方法
- spring下mysql读写分离配置,解决争抢DataSource问题
- MySQL5.6Innodb表的特性和极限
- Android demo 项目-汇总-201611-01期
- 从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明
- 刷新控件MaterialRefreshLayout
- 极光推送能接收到自定义消息,但注册REGISTRATION_ID是null
- RedHat6.5更换centOS源
- ubuntu编译、配置、使用tgt
- 268. Missing Number
- iOS CoreLocation和MapKit详解
- cvWarpAffine( src, dst, warp_mat ); //对图像做仿射变换
- 100天土鸡饲养计划(75)
- 当需要切换多个不同的frame