Code Monkey home page Code Monkey logo

pullloadmorerecyclerview's Introduction

实现RecyclerView下拉刷新和上拉加载更多以及RecyclerView线性、网格、瀑布流效果演示。如果你只需要简单地实现下拉刷新和上拉加载效果,不需要定制,那PullLoadMoreRecyclerView最适合不过。

效果预览

使用方法

build.gradle文件

dependencies {
  compile 'com.wuxiaolong.pullloadmorerecyclerview:library:1.1.2'
}

xml引用

 <com.wuxiaolong.pullloadmorerecyclerview.PullLoadMoreRecyclerView
        android:id="@+id/pullLoadMoreRecyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

设置线性布局

 mPullLoadMoreRecyclerView = (PullLoadMoreRecyclerView) view.findViewById(R.id.pullLoadMoreRecyclerView);
 mPullLoadMoreRecyclerView.setLinearLayout();

设置网格布局

 mPullLoadMoreRecyclerView.setGridLayout(2);//参数为列数

设置交错网格布局,即瀑布流效果

 mPullLoadMoreRecyclerView.setStaggeredGridLayout(2);//参数为列数

绑定适配器

  mRecyclerViewAdapter = new RecyclerViewAdapter();
  mPullLoadMoreRecyclerView.setAdapter(mRecyclerViewAdapter);

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {

    public RecyclerViewAdapter() {

    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);

        }
    }
}

调用下拉刷新和加载更多

 mPullLoadMoreRecyclerView.setOnPullLoadMoreListener(new PullLoadMoreRecyclerView.PullLoadMoreListener() {
            @Override
            public void onRefresh() {

            }

            @Override
            public void onLoadMore() {

            }
        });

刷新结束

mPullLoadMoreRecyclerView.setPullLoadMoreCompleted();

其他方法

显示下拉刷新

mPullLoadMoreRecyclerView.setRefreshing(true);

不需要下拉刷新

mPullLoadMoreRecyclerView.setPullRefreshEnable(false);

不需要上拉刷新

mPullLoadMoreRecyclerView.setPushRefreshEnable(false);

设置上拉刷新文字

mPullLoadMoreRecyclerView.setFooterViewText("loading");

设置上拉刷新文字颜色

mPullLoadMoreRecyclerView.setFooterViewTextColor(R.color.white);

设置加载更多背景色

mPullLoadMoreRecyclerView.setFooterViewBackgroundColor(R.color.colorBackground);

设置下拉刷新颜色

mPullLoadMoreRecyclerView.setColorSchemeResources(android.R.color.holo_red_dark,android.R.color.holo_blue_dark);

快速Top

mPullLoadMoreRecyclerView.scrollToTop();

联系我

我的微信公众号:吴小龙同学,欢迎关注交流。

个人博客

http://wuxiaolong.me/

作者微博

吴小龙同學

License

Apache-2.0

pullloadmorerecyclerview's People

Contributors

codyer avatar ding102992 avatar githubguider avatar luffykou avatar wuxiaolong 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  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

pullloadmorerecyclerview's Issues

SwipeRefreshLayout无法触发

重现步骤如下
1.当前总item长度大于屏幕,且当前屏幕第一个item的position不为0
2.执行删除item操作,删除到总item长度大于屏幕时,当前屏幕第一个item会自动显示position为0的item
3.下拉,无法触发swiperefreshlayout

上拉加载的动画时间太短

上拉加载的动画时间太短,在网速好的时候,一闪就没了。用户体验很不好。能设置foot最短的显示时间么?比如0.5秒?

v1.04 瀑布流下 下拉刷新 异常

瀑布流 拉取到下面 然后 返回上拉 只要第一行的item出现(即使只有一点点) 然后松手 也会执行onRefresh() 并不是完全显示后才刷新

报个bug:下拉加载中,再往上拉则异常崩溃(建议加载过程中,禁止再次加载或者取消再加载)

日志如下:

 Process: com.wuxiaolong.pullloadmorerecyclerview, PID: 15869
    java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 7(offset:7).state:20
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4320)
            at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:4278)
            at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:1947)
            at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1359)
            at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1322)
            at android.support.v7.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1150)
            at android.support.v7.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1007)
            at android.support.v7.widget.RecyclerView.scrollByInternal(RecyclerView.java:1355)
            at android.support.v7.widget.RecyclerView.onTouchEvent(RecyclerView.java:2209)
            at android.view.View.dispatchTouchEvent(View.java:7713)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2210)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1945)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
            at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2330)
            at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1569)
            at android.app.Activity.dispatchTouchEvent(Activity.java:2472)
            at android.support.v7.internal.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:59)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2278)
            at android.view.View.dispatchPointerEvent(View.java:7893)
            at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
            at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
            at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
            at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
            at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
            at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
            at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
            at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
    at

RecyclerView: No adapter attached; skipping layout

调试了一下您的代码,发现logcat里面也会提示如下所示。所以感觉我的错误不应该是这里。但是还是想请问一下,这个如下提示有影响吗?
www

自己的数据接口调通了,但是在RecyclerView就是现实不出来,提示如标题错误
bug
adapter.java
adapter1
adapter2

上面是我获取数据的代码,不知道是哪里错了,还请有空帮我看看,谢谢了

有些卡顿

感谢分享,不过在使用的过程中。发现滑动的时候相比原始的recyclerview 卡了不少。不知是什么原因

ui问题

@WuXiaolong android studio, adapter 的布局是 android:layout_width="match_parent"
android:layout_height="match_parent"
控件也是 android:layout_width="match_parent"
android:layout_height="match_parent"
但是在ui显示时 只有半屏左右
怎么个情况
图一是预览
图二是真机
2016-10-27 15 27 03
2016-10-27 15 27 27

重复解绑造成闪退

异常输出:
java.lang.IllegalStateException: Observer com.wuxiaolong.pullloadmorerecyclerview.PullLoadMoreRecyclerView$EmptyAdapterDataObserver@53ae2ba8 was not registered.

推测异常代码块:
@OverRide
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
RecyclerView.Adapter oldAdapter = mRecyclerView.getAdapter();
if (oldAdapter != null) {
oldAdapter.unregisterAdapterDataObserver(mEmptyDataObserver);
}
}

推测原因:
在Fragment中使用该控件,第一次调用setAdapter方法时会去注册一个观察者,在离开页面时解绑,但如果Fragment没有被销毁是不会再去调用setAdapter方法的,但在异常代码块中会再次调用解绑的方法,造成异常并闪退

下拉刷新动画异常

当按下拉刷新时,在动画开始刷新,但没结束时,此时再下拉刷新,这时,出现bug,那个动画就卡在那里了。
这个问题怎么解决?

上拉加载的问题

如果里面的item比较少的时候。占不满一个屏幕的时候触发不了上拉加载更多的说。

加载更多问题

我刚才出现了一个问题 如果我是每次获取10条数据 加载更多则监听不到,20条的话 就可以监听到了,这是为啥

存在bug

下来多次,出现拉不动的现象

网络断开 会卡

没有网的时候,list会卡。是 根本都不会动。这时候加载,其实是不能滑动的。特别是数据多的时候,网络不好的时候,很明显

RecyclerView: No adapter attached; skipping layout

如题,在前2次加载的时候还有视图,第3次打开就什么都没有,一片空白,是什么回事呢?下载了demo看过代码,也跟着demo做过一些修改,但是并没有用。

its awesome

thank you, my friend. I tried over 10 recyclerview`s, but you code is excellent. Please make it as library in maven

我加了滚动的判断感觉这样也挺好!

@OverRide
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//获取总的适配器的数量
int totalCount = mMyadputer.getItemCount();
Log.e("总的数目", totalCount + "");
Log.e("滚动的状态", newState + "");
//这个就是判断当前滑动停止了,并且获取当前屏幕最后一个可见的条目是第几个,当前屏幕数据已经显示完毕的时候就去加载数据
if (newState == RecyclerView.SCROLL_STATE_IDLE && lastVisibleItem + 1 == mMyadputer.getItemCount()) {
//回调加载更多
mLodeMoreCallBack.LodeMore();
}
}

下拉刷新问题

当下拉滑出进度圈后,然后上滑动回去,此次不触发刷新事件。之后就再也无法下拉刷新了

第一次加载更多之后底部的footer无法消失

第一次滑到底部时候触发加载更多,在回调监听中设置了setPullLoadMoreCompleted()这个方法,但是底部的footer一直在显示,之后再滑动加载数据到最后这个footer就没有了,最后使用了获取到footerview,并给他设置GONE才没有这个问题

viewHolder.getAdapterPosition();获取值一直为-1

@OverRide
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = mInflater.inflate(R.layout.staggered_recycler_view_item, parent, false);
final ViewHolder viewHolder = new ViewHolder(v);
viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@OverRide
public void onClick(View v) {
int position = viewHolder.getAdapterPosition();
//获取出来的positon值一直为-1
Log.i("info", "adapter:onItemClick: " + position);
if (mClickListener != null) {
mClickListener.onItemClick(position, v, viewHolder);
}
}
});

列表为空时,下拉没反应(不能触发刷新)

修改文件app/src/main/java/com/wuxiaolong/pullloadmorerecyclerviewsample/FristFragment.java

private void getData() {
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
          //mRecyclerViewAdapter.getDataList().addAll(setList());
            mRecyclerViewAdapter.notifyDataSetChanged();
            mPullLoadMoreRecyclerView.setPullLoadMoreCompleted();
        }
    }, 3000);
}

注意,注意,注意!只注释掉这行代码
//mRecyclerViewAdapter.getDataList().addAll(setList());

不适用于带header的adapter

1.使用那种包装过支持addHeaderView()的RecyclerView.Adapter,这样通过getItemCount() == 0来计算是否有没数据就显示EmptyView就悲剧了,另外带HeaderView时设置emptyView会覆盖到headerView上。
2. 有时候习惯getRecyclerView()后直接操作RecyclerView本身,然后setAdapter(),这样adapter.registerAdapterDataObserver(mEmptyDataObserver)就不会被执行,关闭的时候unregisterAdapterDataObserver()就会导致throw new IllegalStateException("Observer " + observer + " was not registered.")
不知道Observable为何不设计成没register过的就不处理,也没有检测是否存在注册过Observer的方法。

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.