尊重他人的劳动成果,转载请标明出处:http://blog.csdn.net/gengqiquan/article/details/53432804, 本文出自:【gengqiquan的博客】
之前写过一篇博文 如何写一个通用的列表控件讲到绝大多数项目总都会有各种形形色色的列表界面,但其实这些界面的区别就在于列表子项的布局不同和点击事件的响应不同而已,然而每次有个新的列表界面从适配器到Activity都需要写很多代码。作为一个懒人, 一直想把这些重复的工作给去掉,那篇博文提供了封装思路,许多伙伴要求能形成库方便大家使用。这几天得闲,就完成大家这个心愿 效果如图
默认提供一个SampleRefreshLayout。提供一些默认的样式 可以继承RefreshLayout抽象类实现自己的样式
完整的示例项目地址https://github.com/gengqiquan/RefreshLayout
使用
xml
<com.gengqiquan.layout.SampleRefreshLayout android:id="@+id/refresh" android:layout_width="match_parent" android:layout_height="match_parent"></com.gengqiquan.layout.SampleRefreshLayout>activity初始化
refresh = (SampleRefreshLayout) findViewById(R.id.refresh); //SampleRefreshLayout特有的方法需放在链式调用的前面 refresh .noDataLable("暂时没有订单数据")//无数据文本 .noDataImg(R.drawable.message_default)//无数据图片 .pageCount(20)//分页数量 .refreshEnable(true)//允许手动刷新 .loadMoreEnable(true)//允许分页 .showTopView(true)//显示一键回到顶部按钮 .adapter(new SBAdapter<String>(this) .layout(android.R.layout.simple_list_item_1)//item布局 .bindViewData(new Converter<String>() { @Override public void convert(Holder holder, String item) {//数据绑定 holder.setText(android.R.id.text1, item); } }))//通用适配器 .refresh(new RefreshListener() {//刷新回调 @Override public void onRefresh() { load(true); } }) .loadMore(new LoadMoreListener() {//加载更多回调 @Override public void LoadMore() { load(false); } }) .doRefresh();//主动调用刷新加载初始数据lambda写法
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); refresh = (SampleRefreshLayout) findViewById(R.id.refresh); //SampleRefreshLayout特有的方法需放在链式调用的前面 refresh .noDataLable("暂时没有订单数据") .noDataImg(R.drawable.message_default) .pageCount(20) .refreshEnable(true) .loadMoreEnable(true) .showTopView(true) .adapter(new SBAdapter<String>(this) .layout(android.R.layout.simple_list_item_1) .bindViewData(this::bindViewData)) .refresh(()->load(true)) .loadMore(()-> load(false)) .doRefresh(); } public void bindViewData(Holder holder, String item) { holder.setText(android.R.id.text1, item); }load()请求
private void load(final boolean isrefresh) { new Thread(new Runnable() { @Override public void run() { Looper.prepare(); try { if (isrefresh) Thread.sleep(2000); else Thread.sleep(500); } catch (Exception e) { } runOnUiThread(new Runnable() { @Override public void run() { List<String> list = new ArrayList(); for (int i = 0; i < 20; i++) { list.add(" " + i); } if (isrefresh) refresh.refreshComplete(list); else refresh.loadMoreComplete(list); //请求失败调用 refresh.loadFailure(); } }); } }).start(); }继承RefreshLayout实现自己布局样式
public class MyRefreshLayout extends RefreshLayout { //添加自定义加载更多界面 public SampleRefreshLayout FooterLayout(FooterLayout layout) { mLoadMoreView = layout; return this; } //添加自定义无数据界面,需实现NoDataLayout接口 @Override NoDataLayout onCreateNoDataView() { return new SimpleNoDataLayout(mContext); } //添加自定义加载更多布局,需实现FooterLayout接口 @Override FooterLayout onCreateLoadMoreView() { return mLoadMoreView; } //添加自定义回到顶部按钮布局 @Override View onCreateTopView() { return mTopView; } //添加自定义请求失败布局 @Override View onCreateFailureView() { return mFailureView; } public SampleRefreshLayout(Context context) { this(context, null); } public SampleRefreshLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SampleRefreshLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); build();//记得这一句 }依赖添加
maven
<dependency> <groupId>com.gengqiquan.refresh-layout</groupId> <artifactId>layout</artifactId> <version>1.0.1</version> <type>pom</type> </dependency>gralde
compile 'com.gengqiquan.refresh-layout:layout:1.0.1'lvy
<dependency org='com.gengqiquan.refresh-layout' name='layout' rev='1.0.1'> <artifact name='layout' ext='pom' ></artifact> </dependency>请多多star
有什么建议的可以留言喔
如果我的博客对您有帮助,请留言鼓励下或者点个赞吧!
我建了一个QQ群(群号:121606151),用于大家讨论交流Android技术问题,有兴趣的可以加下,大家一起进步。