android 基础上拉刷新和下拉加载

上拉刷新和下拉加载 本来说是基础,但是上一次使用还是1年前,最近写项目感觉又要重新写。项目还是比较紧哪种,所有写下这边,方便以后使用,也供别人快速写出。

1.框架植入。
对于这种有十分好用,成熟的框架就没必要自己造轮子了。

1.1 build.gradle
compile ‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.1’
我这边随便用用就放这个了
如果头和尾部需要很 花哨,单独引入
//SmartRefreshLayout
implementation ‘com.scwang.smartrefresh:SmartRefreshLayout:1.0.4-7’
implementation ‘com.scwang.smartrefresh:SmartRefreshHeader:1.0.4-7’
1.2 apption 放入公共头
//static 代码段可以防止内存泄露
static {
//设置全局的Header构建器
SmartRefreshLayout.setDefaultRefreshHeaderCreater(new DefaultRefreshHeaderCreater() {
@Override
public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//全局设置主题颜色
return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat(“更新于 %s”));//指定为经典Header,默认是 贝塞尔雷达Header
}
});
//设置全局的Footer构建器
SmartRefreshLayout.setDefaultRefreshFooterCreater(new DefaultRefreshFooterCreater() {
@Override
public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
//指定为经典Footer,默认是 BallPulseFooter
return new ClassicsFooter(context);
}
});
}

1.3 xml布局 放入,也可以是listview ,随意的
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
app:srlAccentColor="#00000000"
app:srlPrimaryColor="#00000000"
app:srlEnablePreviewInEditMode=“true”>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/companyconversation_lv_context"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:overScrollMode="never"
        android:background="#fff"/>


</com.scwang.smartrefresh.layout.SmartRefreshLayout>

1.4 设置号 recyclerview 和adater
recycleAdapter = new RecycleAdapter(mContext , mReportBeans );
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//设置布局管理器
companyconversationLvContext.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper.VERTICAL);
//设置Adapter
companyconversationLvContext.setAdapter(recycleAdapter);

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.MyViewHolder>{
private List mDatas;
private Context mContext;
private LayoutInflater inflater;

    public RecycleAdapter(Context mContext, List<PhoneBean> mDatas) {
        this.mContext=mContext;
        this.mDatas=mDatas;
        inflater=LayoutInflater.from(mContext);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout. conversation_item_text,parent, false);
        MyViewHolder holder= new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, final int position) {
        String realName = mDatas.get(position).getName();
        holder.textView.setText(realName);
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
            intent.setClass(mContext,ConversationDetailsActivity.class);
            intent.putExtra("data", mDatas.get(position));
            mContext.startActivity(intent);
            }
        });
        String substring = realName.substring(1, realName.length());
        holder.companyconversation_item_iv_icon.setTextAndColor(substring, AvatarImageView.COLORS[2]);
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView textView;
        AvatarImageView companyconversation_item_iv_icon;

        public MyViewHolder(View view) {
            super(view);
            textView=(TextView) view.findViewById(R.id. companyconversation_item_tv_name);
            companyconversation_item_iv_icon = (AvatarImageView) view.findViewById(R.id.companyconversation_item_iv_icon);
        }

    }
    //下面两个方法提供给页面刷新和加载时调用
    public void refresh(List<PhoneBean> addList) {
        //刷新数据
        mDatas.removeAll(mDatas);
        mDatas.addAll(addList);
        notifyDataSetChanged();
    }

    //下面两个方法提供给页面刷新和加载时调用
    public void add(List<PhoneBean> addMessageList) {
        //增加数据
        int position = mDatas.size();
        mDatas.addAll(position, addMessageList);
        notifyItemInserted(position);
    }

}

1.5 为刷新控件设置上拉刷新 和下拉加载的监听

mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
page=1;
initData();
mRefreshLayout.finishRefresh(1500);

        }
    });

    //
    mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
        @Override
        public void onLoadmore(RefreshLayout refreshlayout) {
            page++;
            initData();

            mRefreshLayout.finishLoadmore(1500);
        }
    });
    // 设置支持下拉加载 ,其实后面的版本默认支持的
    mRefreshLayout.setEnableAutoLoadmore(true);
    mRefreshLayout.autoRefresh();

2 基本设置完成后,开始配置联网请求,和 分页请求数据 使用
2.1 定义一个 activity下变量page,初始值根据服务器接口的最新值设置
public int page =1;
2.2 联网请求 ,放入 page 。我的联网请求是自己封装过的

    DataControl.getPhoneList(page,new DataResponse() {
        @Override
        public void onSucc(Object response) {
			// 联网请求后刷新 数据
            ArrayList<PhoneBean> re=  (ArrayList<PhoneBean>) response;
            recycleAdapter.refresh(mReportBeans);
        }


        @Override
        public void onFail(String error) {
            Tools.toast(mContext,error);
            mRefreshLayout.finishLoadmore();
            mRefreshLayout.finishRefresh();
        }
    });

2.3 改变代码,加入 下拉加载判断,即page>1时,数据是添加进去,page=1 是全部数据 .数据请求完毕就关闭 刷新和加载
以前
// 联网请求后刷新 数据
ArrayList re= (ArrayList) response;
recycleAdapter.refresh(mReportBeans);
ArrayList re= (ArrayList) response;
if (page==1){
mReportBeans= re;
}else {
mReportBeans.addAll(re);
}
// 自己在 adater 添加的 刷新数据方法
recycleAdapter.refresh(mReportBeans);
//为了好看添加了1500毫秒的延迟
mRefreshLayout.finishLoadmore(1500);
2.4 在下拉刷新 上拉加载添加 控制page逻辑。
当下拉刷新时, page数据重新请求, 数据为第1页或者当前页。我这里是第一页
当上拉加载的时候,page要+1.请求下一页数据, 由于上面page>1,就把下一页数据添加进去,所以list就有2页的数据
mRefreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
page=1;
initData();
mRefreshLayout.finishRefresh(1500);

        }
    });

    //
    mRefreshLayout.setOnLoadmoreListener(new OnLoadmoreListener() {
        @Override
        public void onLoadmore(RefreshLayout refreshlayout) {
            page++;
            initData();

            mRefreshLayout.finishLoadmore(1500);
        }
    });

这样一个项目的刷新就完成了。总之刷新是操作page。当数据加载完毕,关闭所有刷新就可以了

猜你喜欢

转载自blog.csdn.net/qq_40803752/article/details/85727502