Coder Social home page Coder Social logo

recyclerviewadapter's Introduction

RecyclerViewAdapter

简介

一个支持RecyclerView加载更多、添加HeaderView的BaseAdapter

原理、效果

demo下载

导入

1. 添加JitPack仓库

在当前项目根目录下的 build.gradle 文件中添加如下内容:

allprojects {
    repositories {
        ...
        maven { url "https://jitpack.io" }
    }
}

2. 添加项目依赖

dependencies {
        implementation 'com.github.SheHuan:RecyclerViewAdapter:1.2.9'
}

用法

一、创建Adapter

1、创建只有一种ItemView的Adapter

public class CommonRefreshAdapter extends CommonBaseAdapter<T> {

    public CommonRefreshAdapter (Context context, List<T> datas, boolean isLoadMore) {
        super(context, datas, isLoadMore);
    }

    @Override
    protected void convert(ViewHolder holder, T data, int position) {
        //init item
    }

    @Override
    protected int getItemLayoutId() {
        return item_layout;
    }
}

2、创建有多种ItemView的Adapter

public class MultiRefreshAdapter extends MultiBaseAdapter<T> {

    public MultiRefreshAdapter(Context context, List<T> datas, boolean isOpenLoadMore) {
        super(context, datas, isOpenLoadMore);
    }

    @Override
    protected void convert(ViewHolder holder, T data, int position, int viewType) {
        
    }

    @Override
    protected int getItemLayoutId(int viewType) {
        
    }

    @Override
    protected int getViewType(int position, T data) {
       
    }
}

二、初始化Adapter

1、 初始化只有一种ItemView的Adapter

CommonRefreshAdapter mAdapter = new CommonRefreshAdapter(this, data, true);

2、初始化只有一种ItemView的Adapter

MultiRefreshAdapter mAdapter = new MultiRefreshAdapter(this, data, true);

PS:true代表开启加载更多。

3、设置化EmptyView

View emptyView = LayoutInflater.from(this).inflate(R.layout.empty_layout, (ViewGroup) mRecyclerView.getParent(), false);
mAdapter.setEmptyView(emptyView);

4、直接移除EmptyView

mAdapter.removeEmptyView();

5、显示首次预加载无数据或失败的view,以便重新加载或提示用户

View reloadLayout = LayoutInflater.from(this).inflate(R.layout.reload_layout, (ViewGroup) mRecyclerView.getParent(), false);
mAdapter.setReloadView(reloadLayout);

6、设置化加载中、加载失败、加载完成的FooterView布局

mAdapter.setLoadingView(view);

mAdapter.setLoadFailedView(view);

mAdapter.setLoadEndView(view);

7、设置加载更多的回调

mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(boolean isReload) {
                //do your load more;
            }
        });

8、设置只有一种ItemView的Item点击回调

mAdapter.setOnItemClickListener(new OnItemClickListeners<T>() {

            @Override
            public void onItemClick(ViewHolder viewHolder, T data, int position) {

            }
        });

9、设置有多种ItemView类型的Item点击回调

mAdapter.setOnMultiItemClickListener(new OnMultiItemClickListeners<T>() {
            @Override
            public void onItemClick(ViewHolder viewHolder, T data, int position, int viewType) {
                
            }
        });

10、设置Item子view点击事件

mAdapter.setOnItemChildClickListener(R.id.child, new OnItemChildClickListener<String>() {
            @Override
            public void onItemChildClick(ViewHolder viewHolder, String data, int position) {

            }
        });

11、给RecyclerView添加HeaderView

// 可添加多个
mAdapter.addHeaderView(view)

12、控制HeaderView的显示

mAdapter.isShowHeaderView()

13、数据不满一屏时默认关闭自动加载更多,可用如下方法开启

mAdapter.openAutoLoadMore()

14、某些情况你可能需要移除LoadView

mAdapter.clearLoadView()

三、更多操作

1、显示加载更多数据失败时的FooterView

mAdapter.loadFailed();

2、显示加载数据结束的FooterView

mAdapter.loadEnd();

3、重置Adapter

mAdapter.reset();

4、更新列表的相关方法

// 新data插入到原data的尾部(为加载更多封装的方法)
mAdapter.setLoadMoreData(data);

// 新data直接替换原data(为加载更多封装的方法)
mAdapter.setNewData(data);

// 通用插入数据
mAdapter.insert()

// 通用删除数据
mAdapter.remove()

// 通用更新数据
mAdapter.change()

recyclerviewadapter's People

Contributors

shehuan avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

recyclerviewadapter's Issues

关于不满一屏无法刷新问题的解决办法

我的解决办法是在update第一页数据之后判断一下RecyclerView是否能滚动,不能滚动就直接显示loadEndView,这个逻辑是合理的,试想一下没有更多元素可以滚动其实已经代表了没有分页这个概念了

仔细的分析可以看下这篇文章:
RecyclerView,你为什么不回调 onScrolled 方法了?

下面是我的代码:
public void updateData(List datas) {
if (isReset) {
isReset = false;
}
isLoading = false;
dataList.clear();
dataList.addAll(datas);
notifyDataSetChanged();
//判断RecyclerView是否能滚动 不能滚动就无法触发刷新 直接显示暂无更多数据
mRecyclerView.post(new Runnable() {
@OverRide
public void run() {
if (!mRecyclerView.canScrollVertically(1)) {
loadEnd();
}
}
});
}

如果一条数据都没有加载出来

您好,如果一条数据都没有加载出来,也就是没有更新adapter的数据,如何隐藏底部的加载中的view,好像没有提供这样的方法

添加下拉刷新的问题

如果添加下拉刷新功能,在已经加载到end情况下,去下拉刷新,调用你的哪个方法重置状态,不重置的话下拉刷新后第一页下面的footerView就是end了

有个问题

您好,我在使用你这个lib的时候,不显示加载更多或者加载完成的FooterView的时候,您的Demo最下面的item显示不完成,下面的横线看不见

加上下拉刷新,频繁更新数据集会崩溃

java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{9ef0e74 position=9 id=-1, oldPos=-1, pLpos:-1 no parent} android.support.v7.widget.RecyclerView{22c9fd9 VFED..... .F...... 0,0-1440,1974 #7f09025c app:id/recyclerView}, adapter:com.fuju.yuefang.ui.mine.attention.PersonRefreshAdapter@8a5d9e, layout:com.fuju.yuefang.ui.mine.attention.AttentionPersonFragment$2@9a4307f, context:com.fuju.yuefang.ui.mine.attention.AttentionActivity@902b432
    at android.support.v7.widget.RecyclerView$Recycler.validateViewHolderForOffsetPosition(RecyclerView.java:5610)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5792)
    at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:285)
    at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:342)
    at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:358)
    at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:365)
    at android.support.v7.widget.GapWorker.run(GapWorker.java:396)
    at android.os.Handler.handleCallback(Handler.java:808)
    at android.os.Handler.dispatchMessage(Handler.java:101)
    at android.os.Looper.loop(Looper.java:166)
    at android.app.ActivityThread.main(ActivityThread.java:7425)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

一点建议

用大神这个库,用了2年多了,一直觉得不错,唯一的缺点感觉上拉加载的控制不太好,比如有些情况会一直显示加载中,setnewdata如果数据0会报错,等等,但是总体感觉很好

something wrong

hello guys
setNewData is useless for me, it seems source data empty.

上拉加载有问题,

第一次上啦加载,还没加载完成之前。我连续上拉,会根据我上拉的次数一次性加载了多次。

有个错误,请大神帮忙看一下~

我使用加载更多逻辑的时候 当我调用commonAdapter.setLoadMoreData(list); 时,如果list的长度为0的时候,会报下标越界的错误!
场景:一次加载10条数据,刚好数据有20条,所以在加载第三次的时候 服务器返回的list.size=0

如果一条数据都没有加载出来

您好,如果一条数据都没有加载出来,也就是没有更新adapter的数据,如何隐藏底部的加载中的view,好像没有提供这样的方法

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.