RefreshLayout让你半小时以内完成一个列表界面

Posted gengqiquan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RefreshLayout让你半小时以内完成一个列表界面相关的知识,希望对你有一定的参考价值。

尊重他人的劳动成果,转载请标明出处: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技术问题,有兴趣的可以加下,大家一起进步。

以上是关于RefreshLayout让你半小时以内完成一个列表界面的主要内容,如果未能解决你的问题,请参考以下文章

RefreshLayout刷新组件,有详细注释适合使用和中高端学习

Gradle模块化代码精炼:让你的gradle代码控制在100行以内

mysql如何查询某个datetime字段的范围是一个小时范围以内的记录,比如查询今天上午八点到九

一道C语言作业题,让你编写随机生成10以内的整数,并且自己输入计算结果的程序,我编写了一些,求教!!

IdentityServer4 资源

时间过滤器