Code Monkey home page Code Monkey logo

lrecyclerview's Introduction

LRecyclerView

LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。

它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。

推荐

RxJava经典视频教程已经上线,戳我就可以看啦......

效果图

实战项目

为了方便大家更好的在项目中使用LRecyclerView,这里提供一个项目demo,有需要可以参考下!

github地址: https://github.com/jdsjlzx/Community

Gradle

Step 1. 在你的根build.gradle文件中增加JitPack仓库依赖。

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

Step 2. 在你的module的build.gradle文件中增加LRecyclerView依赖。

implementation 'com.github.jdsjlzx:LRecyclerView:1.5.4.3'

LRecyclerView requires at minimum Java 7 or Android 4.0.

JavaDoc

https://jitpack.io/com/github/jdsjlzx/LRecyclerView/1.5.4.3/javadoc/

##项目简述

  1. 下拉刷新、滑动到底部自动加载下页数据;
  2. 可以方便添加Header和Footer;
  3. 头部下拉样式可以自定义;
  4. 具备item点击和长按事件;
  5. 网络错误加载失败点击Footer重新请求数据;
  6. 可以动态为FooterView赋予不同状态(加载中、加载失败、滑到最底等);
  7. 可以根据不同的viewtype自定义item视图;
  8. 具备类似IOS侧滑删除菜单功能;
  9. 完善的局部刷新效果;

注意:

  1. EndlessLinearLayoutActivity.java类里面有标准完整的使用方法,请尽量在这个界面看效果;
  2. 本着解耦的原则,能在demo中实现的就尽量不在libray中实现。
  3. libray中的sdk版本都是最新版本,如果你不想处理申请权限的问题,可以在你本地的app的build.gradle中如下设置:
compileSdkVersion 25
buildToolsVersion '25.0.2'
    
defaultConfig {
        applicationId "com.github.jdsjlzx"
        minSdkVersion 14
        targetSdkVersion 22
        versionCode 4
        versionName "0.5.3"
}

targetSdkVersion设置为22即可。

Demo下载

点我下载

功能介绍

填充数据

mDataAdapter = new DataAdapter(this);
mDataAdapter.setData(dataList);

mLRecyclerViewAdapter = new LRecyclerViewAdapter(mDataAdapter);
mRecyclerView.setAdapter(mLRecyclerViewAdapter);
  1. DataAdapter是用户自己真正的adapter,用户自己定义;
  2. LRecyclerViewAdapter提供了一些实用的功能,使用者不用关心它的实现,只需构造的时候把自己的mDataAdapter以参数形式传进去即可。

添加HeaderView、FooterView

//add a HeaderView
mLRecyclerViewAdapter.addHeaderView(new SampleHeader(this));

//add a FooterView
mLRecyclerViewAdapter.addFooterView(new SampleFooter(this));

添加HeaderView还可以使用下面两种方式:

View header = LayoutInflater.from(this).inflate(R.layout.sample_header,(ViewGroup)findViewById(android.R.id.content), false);
mLRecyclerViewAdapter.addHeaderView(header);


CommonHeader headerView = new CommonHeader(getActivity(), R.layout.layout_home_header);
mLRecyclerViewAdapter.addHeaderView(headerView);

上面的方式同样适用于FooterView。

移除HeaderView、FooterView

//remove a HeaderView
mLRecyclerViewAdapter.removeHeaderView();

//remove a FooterView
mLRecyclerViewAdapter.removeFooterView();

注意:

1.如果有两个以上的HeaderView,连续调用mLRecyclerViewAdapter.removeHeaderView()即可。

LScrollListener-滑动监听事件接口

LScrollListener实现了onScrollUp()、onScrollDown()、onScrolled、onScrollStateChanged四个事件,如下所示:

void onScrollUp();//scroll down to up

void onScrollDown();//scroll from up to down

void onScrolled(int distanceX, int distanceY);// moving state,you can get the move distance

void onScrollStateChanged(int state);
  • onScrollUp()——RecyclerView向上滑动的监听事件;
  • onScrollDown()——RecyclerView向下滑动的监听事件;
  • onScrolled()——RecyclerView正在滚动的监听事件;
  • onScrollStateChanged(int state)——RecyclerView正在滚动的监听事件;

使用:

mRecyclerView.setLScrollListener(new LRecyclerView.LScrollListener() {
            @Override
            public void onScrollUp() {
            }

            @Override
            public void onScrollDown() {
            }

            @Override
            public void onScrolled(int distanceX, int distanceY) {
            }
            @Override
            public void onScrollStateChanged(int state) {

            }

        });
 

下拉刷新

mRecyclerView.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh() {
                
            }
        });

加载更多

mRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                
            }
        });

设置下拉刷新样式

mRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader); //设置下拉刷新Progress的样式
mRecyclerView.setArrowImageView(R.drawable.iconfont_downgrey);  //设置下拉刷新箭头

AVLoadingIndicatorView库有多少效果,LRecyclerView就支持多少下拉刷新效果,当然你也可以自定义下拉刷新效果。

效果图:

这里写图片描述

自定义下拉刷新View

  1. 自定义view实现IRefreshHeader接口;
  2. 调用LRecyclerView提供的setRefreshHeader(IRefreshHeader refreshHeader)即可。
/**
 * 设置自定义的RefreshHeader
 */
public void setRefreshHeader(IRefreshHeader refreshHeader) {
    this.mRefreshHeader = refreshHeader;
}

设置下拉刷新Header和Footer文字内容和颜色

//设置头部加载颜色
mRecyclerView.setHeaderViewColor(R.color.colorAccent, R.color.dark ,android.R.color.white);
//设置底部加载颜色
mRecyclerView.setFooterViewColor(R.color.colorAccent, R.color.dark ,android.R.color.white);
//设置底部加载文字提示
mRecyclerView.setFooterViewHint("拼命加载中","已经全部为你呈现了","网络不给力啊,点击再试一次吧");

记得设置ProgressStyle:

mRecyclerView.setRefreshProgressStyle(ProgressStyle.LineSpinFadeLoader);
mRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.BallSpinFadeLoader);

开启和禁止下拉刷新功能

mRecyclerView.setPullRefreshEnabled(true);

or

mRecyclerView.setPullRefreshEnabled(false);

默认是开启。

强制刷新

根据大家的反馈,增加了一个强制刷新的方法,使用如下:

mRecyclerView.forceToRefresh();

无论是下拉刷新还是强制刷新,刷新完成后调用下面代码:

mRecyclerView.refreshComplete(pageSize);
mLRecyclerViewAdapter.notifyDataSetChanged();

下拉刷新清空数据

有的时候,需要下拉的时候清空数据并更新UI,可以这么做:

@Override
public void onRefresh() {
    mDataAdapter.clear();
    mLRecyclerViewAdapter.notifyDataSetChanged();//必须调用此方法
    mCurrentCounter = 0;
    requestData();
}

如果不需要下拉的时候清空数据并更新UI,如下即可:

@Override
public void onRefresh() {
    requestData();
}

开启和禁止自动加载更多功能

mRecyclerView.setLoadMoreEnabled(true);

or

mRecyclerView.setLoadMoreEnabled(false);;

默认是开启。如果不需要自动加载更多功能(也就是不需要分页)手动设置为false即可。

加载数据完成处理

mDataAdapter.addAll(list);
mRecyclerView.refreshComplete(REQUEST_COUNT);// REQUEST_COUNT为每页加载数量

如果没有更多数据(也就是全部加载完成),判断逻辑如下:

mRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {

                if (mCurrentPage < totalPage) {
                    // loading data
                    requestData();
                } else {
                    mRecyclerView.setNoMore(true);
                }
            }
        });

去除底部的加载更多的view

如果你的逻辑是一次性加载所有的数据,那么可以如下设置:

mRecyclerView.setLoadMoreEnabled(false);;

mRecyclerView.setOnLoadMoreListener就不需要设置了.

加载数据网络异常处理

加载数据时如果网络异常或者断网,LRecyclerView为你提供了重新加载的机制。

效果图:

这里写图片描述

网络异常出错代码处理如下:

mRecyclerView.setOnNetWorkErrorListener(new OnNetWorkErrorListener() {
                @Override
                public void reload() {
                    requestData();
                }
            });

上面的mFooterClick就是我们点击底部的Footer时的逻辑处理事件,很显然我们还是在这里做重新请求数据操作。

点击事件和长按事件处理

先看下怎么使用:

mLRecyclerViewAdapter.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                
            }

        });

mLRecyclerViewAdapter.setOnItemLongClickListener(new OnItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, int position) {
                
            }
        });

原理就是实现viewHolder.itemView的点击和长按事件。由于代码过多就不贴出来了。

viewHolder源码如下:

public static abstract class ViewHolder {
        public final View itemView;
        int mPosition = NO_POSITION;
        int mOldPosition = NO_POSITION;
        long mItemId = NO_ID;
        int mItemViewType = INVALID_TYPE;
        int mPreLayoutPosition = NO_POSITION;

设置空白View(setEmptyView)

mRecyclerView.setEmptyView(view);

需要注意的是布局文件,如下所示:

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>

    <com.github.jdsjlzx.recyclerview.LRecyclerView
        android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <include
        android:id="@+id/empty_view"
        layout="@layout/layout_empty"
        android:visibility="gone"/>
</android.support.design.widget.CoordinatorLayout>

关于添加分割线

经过不断优化,LRecyclerView支持了ItemDecoration,使用如下所示:

LinearLayoutManager布局设置如下:

DividerDecoration divider = new DividerDecoration.Builder(this,mLRecyclerViewAdapter)
                .setHeight(R.dimen.default_divider_height)
                .setPadding(R.dimen.default_divider_padding)
                .setColorResource(R.color.split)
                .build();
mRecyclerView.addItemDecoration(divider);

GridLayoutManager布局设置如下:

int spacing = getResources().getDimensionPixelSize(R.dimen.dp_4);
mRecyclerView.addItemDecoration(SpacesItemDecoration.newInstance(spacing, spacing, manager.getSpanCount(), Color.GRAY));

//根据需要选择使用GridItemDecoration还是SpacesItemDecoration
GridItemDecoration divider = new GridItemDecoration.Builder(this)
        .setHorizontal(R.dimen.default_divider_padding)
        .setVertical(R.dimen.default_divider_padding)
        .setColorResource(R.color.split)
        .build();
//mRecyclerView.addItemDecoration(divider);

根据需要选择使用GridItemDecoration还是SpacesItemDecoration,SpacesItemDecoration(支持多类型布局)

同样的,LuRecyclerView也支持了ItemDecoration,只是命名稍微不同(类名以Lu开头,如LuGridItemDecoration、LuSpacesItemDecoration)

滑动删除

效果图:

分组

效果图:

这里写图片描述

功能还在完善中....

PullScrollView、PullWebView也有实现,为了解耦,这两个类都放在了demo中,有需要的可以自己修改使用!

代码混淆

#LRecyclerview
-dontwarn com.github.jdsjlzx.**
-keep class com.github.jdsjlzx.progressindicator.indicators.** { *; }

如果你想了解更多混淆配置,参考:http://blog.csdn.net/jdsjlzx/article/details/51861460

注意事项

1.如果添加了footerview,不要再使用setLScrollListener方法,如有需要,自定义实现即可。如下面代码不要同时使用:

mRecyclerView.setLScrollListener(LScrollListener); 
mLRecyclerViewAdapter.addFooterView(new SampleFooter(this));

2.不要SwipeRefreshLayout与LRecyclerView一起使用,会有冲突,为了更好的满足广大用户,新增了LuRecyclerView类,可以与SwipeRefreshLayout搭配使用,详细请参考SwipeRefreshLayoutActivity类的实现。

3.关于RecyclerView自动滑动的问题

这个自动滑动归根结底是焦点问题,子item有焦点,导致RecyclerView自动滑动到了子item,在根布局上加了android:descendantFocusability="blocksDescendants",根view来处理焦点,不传给子view就能解决问题。

4.关于LRecyclerView嵌套RecyclerView滑动卡顿的问题

可以参考:#165

LRecyclerView的应用

效果图:

代码详见:https://github.com/jdsjlzx/Community

Thanks

1.SwipeDelMenuViewGroup

问题反馈

QQ交流群1:183899857
QQ交流群2:250468947

打赏

觉得本框架对你有帮助,不妨打赏赞助我一下,让我有动力走的更远。

支付宝

lrecyclerview's People

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  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

lrecyclerview's Issues

建议

我认真研究了代码,我感觉LRecyclerView里面的代码有点混乱,而且ViewPager和Item的Swipe功能可以抽取出来,再自定义两个RecyclerView类。

希望增加多语言支持

如题。除了value里面增加语言文件夹之外,或许可以像bugly一样,引用静态字符串。然后用户可以随时修改这个静态字符串,这种感觉会更加灵活
eg.
public class Beta extends a { public static final String TAG_IMG_BANNER = "beta_upgrade_banner"; public static final String TAG_TITLE = "beta_title"; public static final String TAG_UPGRADE_INFO = "beta_upgrade_info"; public static final String TAG_UPGRADE_FEATURE = "beta_upgrade_feature"; public static final String TAG_CANCEL_BUTTON = "beta_cancel_button"; public static final String TAG_CONFIRM_BUTTON = "beta_confirm_button"; public static final String TAG_TIP_MESSAGE = "beta_tip_message"; public static String strToastYourAreTheLatestVersion = "你已经是最新版了"; public static String strToastCheckUpgradeError = "检查新版本失败,请稍后重试"; public static String strToastCheckingUpgrade = "正在检查,请稍候..."; public static String strNotificationDownloading = "正在下载"; public static String strNotificationClickToView = "点击查看"; public static String strNotificationClickToInstall = "点击安装"; public static String strNotificationClickToRetry = "点击重试"; public static String strNotificationClickToContinue = "继续下载"; }

文字显示没有及时更新

拉到底后显示"已经到底了",这个时候在做下拉操作,然后在上拉操作,会先看到"已经到底了",然后再变成“正在加载中”

建议

建议做成任意view下拉刷新和上滑加载更多

分割线问题

当添加分割线时 下拉刷新的View下也有一条个分割线显示, 应该没有

Entity的作用是什么

public abstract class Entity implements Serializable{
    public int id;
    public int type; // content type
}

这个类中 id 和 type 的作用是什么 ? 我查看引用到的地方,都不是和LRecyclerView实现所必须的,那么为什么还需要这两个属性呢 ?

还有,这个Entity类能改为接口形式么 ? 有时候对象是继承自其它类的,不方便再继承Entity

封装尽量简洁一些,

尽量不要暴漏太多的操作,比如:PreviewHandler封装起来,直接暴漏几个回调方法就可以了~

添加Header卡顿问题

添加了ViewPager作为头部,上滑一小段至头部刚好不可见,然后用手指按住向下拖动,在经过头部时会卡住

fragment

分页时setFooterViewState 方法能否用到fragment里面,好像没找到相应代码

下拉刷新样式问题

setRefreshProgressStyle 时候,progress 的颜色能换吗

如何自定义 下拉的样式,没有发现对外设置 view 的方法

footView有一个显示方面的小问题

只要调用了RecyclerViewStateUtils里面的方法setFooterViewState,就会把footView的状态改成显示。这样会导致一个问题,比如强制下拉刷新(把数据清除,然后notifyxxxxx),这个时候,界面就会看到上次设置的footerview的内容,因为状态已经设置为visiable。也就是说,如果有请求数据,那么先会闪现footerview的内容,然后再显示列表视图,这样用户体验不好。目前自用版本做法还是暴露一个方法,可以从外部设置footerview的显示状态,但感觉不是十分优雅。。。

布局文件无法正常渲染:Rendering Problems Error occurred while trying to setup RecyclerView.

java.lang.ClassCastException: com.android.layoutlib.bridge.android.support.Adapter cannot be cast to com.github.jdsjlzx.recyclerview.LRecyclerViewAdapter
at com.github.jdsjlzx.recyclerview.LRecyclerView.setAdapter(LRecyclerView.java:151)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.android.layoutlib.bridge.util.ReflectionUtils.invoke(ReflectionUtils.java:45)
at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setProperty(RecyclerViewUtil.java:126)
at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setProperty(RecyclerViewUtil.java:120)
at com.android.layoutlib.bridge.android.support.RecyclerViewUtil.setAdapter(RecyclerViewUtil.java:62)
at android.view.BridgeInflater.setupViewInContext(BridgeInflater.java:292)
at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:188)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:394)
at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:229)
at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:426)
at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:350)
at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:520)
at com.android.tools.idea.rendering.RenderTask$2.compute(RenderTask.java:508)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:967)
at com.android.tools.idea.rendering.RenderTask.createRenderSession(RenderTask.java:508)
at com.android.tools.idea.rendering.RenderTask.access$600(RenderTask.java:75)
at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:620)
at com.android.tools.idea.rendering.RenderTask$3.call(RenderTask.java:617)
at com.android.tools.idea.rendering.RenderService.runRenderAction(RenderService.java:371)
at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:617)
at com.android.tools.idea.rendering.RenderTask.render(RenderTask.java:639)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:654)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1700(AndroidLayoutPreviewToolWindowManager.java:82)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:596)
at com.intellij.openapi.progress.impl.CoreProgressManager$2.run(CoreProgressManager.java:142)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:446)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:392)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:54)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:127)
at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:591)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:337)
at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:327)
at com.intellij.util.ui.update.MergingUpdateQueue$3.run(MergingUpdateQueue.java:271)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:286)
at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:244)
at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:234)
at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
at com.intellij.util.Alarm$Request$1.run(Alarm.java:352)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

onBottom

建议换个名字,希望作者采纳

Called attach on a child which is not detached: ViewHolder...

这个问题,一般在发生在上拉加载更多,有时候下拉刷新也会。关于这个问题,发现你在EndlessLinearLayoutActivity.java,87行中有加这么一句代码:mLRecyclerViewAdapter.notifyDataSetChanged();
但是这样并不能解决问题。具体原因没有去研究。说说我的解决方法(使用了项目中的:ListBaseAdapter)。ListBaseAdapter中的setDataList、addAll、remove、clear方法中,都有notifyxxxx方法,经过试验。有两种解决方法:
(1)删除上述方法里面的notifyxxxx方法。在调用上述方法之后,紧接着调用xxxadapter.notifyDataSetChanged方法;
(2)可以保留上述方法里面的notifyxxxx方法,在调用上述方法之后,紧接着调用xxxadapter.notifyDataSetChanged方法。考虑到notify两次,所以不建议。

下面是具体的错误信息:
java.lang.IllegalArgumentException
Called attach on a child which is not detached: ViewHolder{742af16 position=40 id=-1, oldPos=-1, pLpos:-1}

1 android.support.v7.widget.RecyclerView$5.attachViewToParent(RecyclerView.java:692)
2 android.support.v7.widget.ChildHelper.attachViewToParent(ChildHelper.java:239)
3 android.support.v7.widget.RecyclerView.addAnimatingView(RecyclerView.java:1178)
4 android.support.v7.widget.RecyclerView.animateDisappearance(RecyclerView.java:3535)
5 android.support.v7.widget.RecyclerView$4.processDisappeared(RecyclerView.java:456)
6 android.support.v7.widget.ViewInfoStore.process(ViewInfoStore.java:246)
7 android.support.v7.widget.RecyclerView.dispatchLayoutStep3(RecyclerView.java:3385)
8 android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3135)
9 android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3568)
10 android.view.View.layout(View.java:15718)
11 android.view.ViewGroup.layout(ViewGroup.java:5039)
12 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
13 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
14 android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
15 android.view.View.layout(View.java:15718)
16 android.view.ViewGroup.layout(ViewGroup.java:5039)
17 android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
18 android.widget.FrameLayout.onLayout(FrameLayout.java:514)
19 android.view.View.layout(View.java:15718)
20 android.view.ViewGroup.layout(ViewGroup.java:5039)
21 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
22 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
23 android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
24 android.view.View.layout(View.java:15718)
25 android.view.ViewGroup.layout(ViewGroup.java:5039)
26 android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
27 android.widget.FrameLayout.onLayout(FrameLayout.java:514)
28 android.view.View.layout(View.java:15718)
29 android.view.ViewGroup.layout(ViewGroup.java:5039)
30 android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
31 android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
32 android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
33 android.view.View.layout(View.java:15718)
34 android.view.ViewGroup.layout(ViewGroup.java:5039)
35 android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
36 android.widget.FrameLayout.onLayout(FrameLayout.java:514)
37 android.view.View.layout(View.java:15718)
38 android.view.ViewGroup.layout(ViewGroup.java:5039)
39 android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2127)
40 android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1884)
41 android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1102)
42 android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5930)
43 android.view.Choreographer$CallbackRecord.run(Choreographer.java:769)
44 android.view.Choreographer.doCallbacks(Choreographer.java:582)
45 android.view.Choreographer.doFrame(Choreographer.java:552)
46 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:755)
47 android.os.Handler.handleCallback(Handler.java:739)
48 android.os.Handler.dispatchMessage(Handler.java:95)
49 android.os.Looper.loop(Looper.java:135)
50 android.app.ActivityThread.main(ActivityThread.java:5298)
51 java.lang.reflect.Method.invoke(Native Method)
52 java.lang.reflect.Method.invoke(Method.java:372)
53 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
54 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:708)

怎么获取滚动状态

LRecyclerView.setLScrollListener(LScrollListener listener);
接口方法里无法获取页面滚动的状态。
×××××××××
我需要做的是,当页面不滚动时才去加载数据。我需要知道页面的滚动状态。
或者你有别的好的想法也可以。谢谢!!!

设置了emptyView导致数据没有办法显示

有这么一个需求,刚刚进入界面的时候,显示emptyview,与此同时请求网络数据,网络数据请求回来之后,emptyview隐藏,同时显示列表视图。现在是,只要emptyview出现了,列表视图就没有办法显示。翻了下源码,LRecyclerView这个类,DataObserver里面的onChanged只有在setAdapter的时候才会调用。目前自用的版本,新增了一个public方法,把DataObserver的成员变量暴露出去,然后有需要再调用。
eg.
public void onDataChange ()
{
mDataObserver.onChanged();
}

下拉刷新高度有问题!

情况是这样,我在设置好了下拉刷新后,先用力下拉,然后惯性滑到底部,再用力上拉回到顶部,反复几次通过惯性到顶部的 “正在刷新”这个header高度有问题
image
如图,希望能尽快解决

在上拉下拉时,滑动不够流畅

上拉下拉时,没有recyclerView的流畅,用力一拉,手指离开屏幕时滑动就停止,recyclerview则在手指离开屏幕的时候还能根据惯性滑动一些距离。

关于color的问题

这几个命名在Android使用比较普遍
colorPrimary
colorPrimaryDark
colorAccent

由于我项目中的style、color文件是放在单独的module中的,引入LRecyclerView后,导致会先加载LRecyclerView的color。

希望在LRecyclerView中,将这几个命名改为其他的

Demo滑动不流畅

表现为小距离滑动时,偶有出现滑动失效,大幅度滑动没有问题

坑逼

怎么搞的,非要应用24以上的v4包,你行不行啊

这个能显示滚动条吗?

原来用的是pullLoadMoreRecyclerView,结果发现不能显示滚动条。现在想换这个,用之前得问问

侧滑删除

侧滑删除有个很大的问题,删第一条还正确,当删第二条的时候就会自动删除第三条,第二条并没删,再删第二条的时候又接着删第三条。。。看到请麻烦速度回复解决一下。。鄙人太菜没弄出来。。因为项目用的就是你的这个侧滑删除

设置标志

首次设置 RecyclerViewStateUtils.setFooterViewState时 就直接跳到了末尾?

api设计的一些建议

先要感谢作者的开源项目,已经在项目中用到了,嘿嘿
1,接口尽量小一点,比如LScrollListener建议拆分成几个小接口,或者使用抽象
2,增加一些自定义属性,比如刷新的样式,这些可以xml中指定
3,new LRecyclerViewAdapter(mAdapter), RecyclerViewStateUtils.setFooterViewState这类的操作可以抽取为LRecycleView的api,使用工具类会增加使用成本
4,AVLoadingIndicatorView的颜色好像没有提供api或者属性,外部不知道怎么去改颜色
不知道提的对不对,只是个人的看法.

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.