Baserecyclerviewadapterhelper: 功能添加建议收集

Created on 9 Nov 2016  ·  83Comments  ·  Source: CymChad/BaseRecyclerViewAdapterHelper

仅限于功能新增提议,使用过程中遇到的问题可以参考https://github.com/CymChad/BaseRecyclerViewAdapterHelper/issues/906

Most helpful comment

左滑出菜单

All 83 comments

應該不算功能
但我覺得滿有用的東西
希望能加個 CHANGE LOG
在裡面寫一些個版本間的差異等等
這樣在判斷是否要進版會比較有好

希望添加一个 下拉刷新~, 最好可以让用户可以自定义, 把滑动距离,状态什么的回传出来.

下拉刷新单纯用adapter是无法实现的,推荐使用 https://github.com/anzaizai/EasyRefreshLayout

是否可以考虑一种方式,来添加RecyclerView上下多出的可拉距离, 类似于iOS UITableView的contentInset.

这个库主要是Adapter不是RecyclerView,所以不会考虑对RecyclerView做一些定制的东西

setEmptyView 开始设置有用 后来在去setEmptyView就不管用 需要从新 setAdapter才能强制显示 这样挺浪费性能的 望群主 有时间优化下 开源万岁 谢谢了

setEmptyView 开始设置有用 后来在去setEmptyView就不管用 需要从新 setAdapter才能强制显示

遇到了同样的问题,

  1. 开始设置的是
    mQuickAdapter.setEmptyView(mLoadingView);
  2. 数据加载完成后,当列表为空时,设置显示为
   mQuickAdapter.setEmptyView(mEmptyView);
   mQuickAdapter.notifyItemChanged(0);

但是mEmptyView却显示不去来,显示的仍然是mLoadingView。

  1. 如果网络连接异常,导致加载失败
    getQuickAdapter().setEmptyView(mErrorView);
    getQuickAdapter().notifyItemChanged(0);

mErrorView可以正常显示出来。

所以很奇怪,都是调用的setEmptyView方法,为什么1,2不可以显示,而1,3缺可以显示。请问如何解决2中的问题呢?

另一个问题是,调用空页面的逻辑块应该加上mSwipeRefreshLayout.setRefreshing(false);方法,否则刷新的动画不会消失。

Update

使用@dyamail说的

需要从新 setAdapter才能强制显示

确实解决了。但是重新setAdapter确实不好,代码逻辑也有点乱。

能否在Demo中增加一个单选/多选效果展示?,多选跟单选也是比较常用的列表形式

@loganguo 由于RecyclerView缓存机制,目前只能切换两种布局

后续会优化

compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.6.1' 已经更新了 @loganguo @dyamail

@CymChad 切换多种布局的优化已经发布到2.6.1了是吗?

恩 是的,setEmptyView 可以切换多种布局

左滑出菜单

首先这是一个很棒的项目,有一个建议如下:

关于最新的loadmore(2.6.+)

看了一下,是在getItemViewType中遍历,也就是说不判断是否占满一页,这种做法对于小数据不太友好,比如说一个搜索列表,可能只返回一两个数据,用户还没滑动的时候自动去执行loadmore了,导致setnewdata之后迅速地loadend。

能否把关于loadmore的public出来,让开发者决定是否在adapter里操作还是recyclerview里操作.

@luoganguo 我想了个折中的办法,复写setNewData();

 @Override
    public void setNewData(List<T> data) {
        super.setNewData(data);
        setEnableLoadMore(false);
    }

我的用是rxjava,加载完后 判断是否满足一页,若满足 再开启。

  @Override
                    public void onTerminate() {
                        super.onTerminate();
                        if (mSwipeRefreshLayout != null)
                            mSwipeRefreshLayout.setRefreshing(false);
                        if (type == REFRESH) {
                            mRecyclerView.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    if ((mLayoutManager.findLastCompletelyVisibleItemPosition() + 1) != mAdapter.getItemCount()) {
                                        mAdapter.setEnableLoadMore(true);
                                    }
                                }
                            }, 50);
                        }
                    }

建议把 ErrorViewEmptyView 拆分为两个模块,根据目前提供的 API 只能反复调用 setEmptyView() 以达到效果,避免反复调用 removeAllViewsaddView 方法

请问有暴露position的方法吗,我没找到,没有的话希望暴露一个谢谢

@BTFTUK 文档有写

是否能实现section的顶部悬浮

@CymChad 你推荐的https://github.com/anzaizai/EasyRefreshLayout 第三方刷新库
也有上拉加载,与BRVAH中的上拉加载用哪个兼容性好点啊?

EasyRefreshLayout可以配合adapter使用,这样业务分离更加清晰易控制

建议增加个快速滚动到指定item的方法,可以让开发者自由选择带动画或者不待动画。

@lujianzhao 快速滚动到指定item的方法 请参考此处 https://github.com/AllenCoder/Recyclerview

怎么用databinding呢

demo有源码 @dinomonster

@ittianyu 分割线是RecyclerView 单独设置的,和adapter无关。

建议 开个issue把展示图片放到专门的issue里,避免每次clone项目的时候把不必要的图片下下来,看了一下,目前大约有10m,并且github的速度又不是很稳定:)
@CymChad
multiple_demo

@tysheng 好的后续优化,感谢建议。

@DanteAndroid 如果是view的话就可以传入自定义view,如果是layout id 的话就只能传入布局文件了。

@CymChad 我的意思是添加一個方法。又不是只要layout id的方法。。

ok @DanteAndroid 这个可以

@DanteAndroid 这样的话需要传入2个参数
setEmptyView(int layoutResId, ViewGroup viewGroup)

@CymChad OK, 跟我说的一样。

@DanteAndroid 今天我会发一个新的版本,好了M你。

@CymChad 没必要。。就是一点微小的建议而已。辛苦啦

@CymChad 另外默认emptyView有吗?谢啦

@DanteAndroid compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.7.4' 没有

关于拖动能不能有个禁用,当我不用的时候我可以禁用即和正常的适配器一样

能不能加个更新日志说明

@akingyin1987 https://github.com/CymChad/BaseRecyclerViewAdapterHelper/releases 每次更新都有日志。

@akingyin1987 你不用的时候不设置就好了。

希望加个头部粘连的功能,类似section的例子,不过头部会置顶

@Tiannuo https://github.com/oubowu/PinnedSectionItemDecoration 配合这个库可以实现你的功能。

已经搞定了,不用的时候可以将 ItemDragAndSwipeCallback.setDragMoveFlags(0)这就OK了

@akingyin1987 感谢你的分享

adapter好像不支持diffutils的局部刷新?

@pye52 恩 是的目前没有。

@tysheng 已优化工程大小,目前整个源码下载下来,878kb。

@CymChad 在RecyclerView嵌套在ScrollView里的情况下,nofiyDataSetChange会调用onLoadMoreRequested

@CymChad 有解决办法吗?急求

@roger66 如果你一定要ScrollView嵌套的话,我建议你使用第三方的上拉。

@CymChad 好的,谢谢

viewhodler.getLayoutPosition(); 如果添加过头的话 位置会错一位 能否提供一个真实的Position的方法

@Biswangluo 原理就是头部也算一个item。你可以
holder.getLayoutPosition() - getHeaderLayoutCount()
在上层给具体数据的时候就是这样处理的

convert(holder, mData.get(holder.getLayoutPosition() - getHeaderLayoutCount()));

长按拖动的时候,能不能给拖动的item设置一个动画效果,现在只是会震动,

这个库的功能非常强大!先赞一个。提个想法,我想应该是所有初次使用这个库的新手都会有的问题:项目的demo工程体积太大,逻辑关系纵横交叉形成了一个强耦合的大项目,但是初次接触这个库的大多数人只想快速使用其中一个或几个功能,因此若将大一统的demo分成若干以单一功能为目的的几个小demo工程会更让人易懂,更易引入到自己的项目中来。另外大一统的demo用AndroidStudio打开编译需要非常非常非常长的时间,我等了半个小时后无奈的关掉,只能一个个的打开文件看,在代码级别剔除自己不需要的功能,找到需要的功能,很麻烦。虽然分几个小demo工作量对于库开发者有很多重复的地方,但是我想是值得的。最后谢谢你们!

是否考虑出一个正式版本?确定下 调用方法名或者类名;不然有时候一个版本的更新就导致项目里其他代码也要随之改变。

建议,添加一个测滑菜单功能,很多时候会用到这个功能。

建议在BaseViewHolder的getView里面对属于复用的view加一个tag标识一下

public <T extends View> T getView(int viewId) {
        View view = views.get(viewId);
        if (view == null) {
            view = convertView.findViewById(viewId);
            views.put(viewId, view);
        }
        view.setTag(R.id.recycer_resue, true);
        return (T) view;
    }

原因是我在recycleview(A)中嵌套了recycleview(B),并且B中使用了addItemDecoration,如果B是属于复用的话就不能再调用'addItemDecoration'(这个方法效果会叠加)

@LittleHans8 恩,下次我们会优化文档。

@AndyLeeBlue 构建慢,可能是gradle版本问题,你可以把gradle配置改成你自己项目的gradle版本。

@JueShouGitHub 这个是属于item的功能,而不是adapter的功能,考虑到耦合的问题,所以没有加入。

@Joyce1991 如果加上了setTag,你会如何处理你说的问题呢?

左滑删除?像ios那样的效果

@tysheng 自动LoadMore 有别的处理方法吗

BaseMultiItemQuickAdapter 希望增加展开/折叠全部功能,很多页面的需求都是上来全部展开的,希望能考虑一下,就比如这样的展开全部效果
int addedCound;
int nextPosition = 0;
do {
addedCound = mAdapter.expand(nextPosition);
nextPosition += addedCound + 1;
} while (addedCound != 0);

2.8.6已经建议在Adapter内部持有 RecyclerView 对象了,既然这样的话,何不提供一个方法
类似

    public void bindToRecyclerView(RecyclerView recyclerView) {
        if (mRecyclerView != null) {
            throw new RuntimeException("Don't bind twice");
        }
        mRecyclerView = recyclerView;
        mRecyclerView.setAdapter(this);
    }

在初始化的时候就持有recyclerview,
对之后的 设置empty view等一系列方法都可以免去传一个viewgroup的实例

 checkNotNull();
        View v = LayoutInflater.from(mRecyclerView.getContext()).inflate(R.layout.item_layout_loading, mRecyclerView, false);
        setEmptyView(v);

同时建议向子类提供get recyclerview的方法

@CymChad

@tysheng 恩,不错的建议,可以的。

@qstumn 收到

希望可以集成网络图片加载(Glide、ImageLoader、picasso、fresco等)

希望添加INVISIBLE 功能

/**
* Set a view visibility to INVISIBLE
*
* @param viewId The view id.
* @return The BaseViewHolder for chaining.
*/
public BaseViewHolder setInVisible(int viewId) {
View view = getView(viewId);
view.setVisibility(View.INVISIBLE);
return this;
}

希望添加 setFocusable 、setClickable 方法

@Android-KJY 感谢你的建议,加载网络图片这一块需要开发者自己加载,因为考虑到实战项目中都有自己的图片加载库,如果封装在里面就耦合了,不能强迫所有的开发者都使用框架内置的图片加载库,所以在使用的代码块里面,我们可以看到它是通过一个getView的方法拿到imageView对象再去通过自己的常用图片加载框架去做相应的图片加载。

@Android-KJY 我们现在提供了自定义ViewHolder,你可以自定义一个然后任意添加你需要的方法,因为如果无限的添加方法,这个BaseViewHolder就会无限大。

这个issues楼层过高,加载速度慢了,我重新开个issues。

群主,啥时候能出类似手机通讯录列表的功能呀

Was this page helpful?
0 / 5 - 0 ratings