Giter Site home page Giter Site logo

bingoogolapple / bgabaseadapter-android Goto Github PK

View Code? Open in Web Editor NEW
659.0 26.0 138.0 2.29 MB

在 AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder。RecyclerView 支持 DataBinding 、多种 Item 类型、添加 Header 和 Footer。RecyclerView 竖直方向通用分割线 BGADivider

Java 100.00%
baseadapter recyclerview-divider recyclerview-header recyclerview-section recyclerview-sticky androidx

bgabaseadapter-android's Introduction

🏃BGABaseAdapter-Android🏃

目录

功能介绍

在 AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder。

  • BGAAdapterViewAdapter 和 BGAViewHolderHelper 用于简化 AdapterView 的子类(如 ListView、GridView)的适配器的编写
  • BGARecyclerViewAdapter 和 BGAViewHolderHelper 用于简化 RecyclerView 的适配器的编写,支持多 Item 类型,支持添加多个 Header 和 Footer,回调接口里的索引位置已经在库里处理了,不需要开发者自己减去 Header 个数
  • BGADivider 用于简化 RecyclerView 分割线的编写,以及轻松实现基于 RecyclerView 的吸顶悬浮分类索引
  • BGABindingRecyclerViewAdapter 和 BGABindingViewHolder 用于 RecyclerView 结合 DataBinding 使用时简化 RecyclerView 的适配器的编写,支持多 Item 类型,支持添加多个 Header 和 Footer,回调接口里的索引位置已经在库里处理了,不需要开发者自己减去 Header 个数
  • BGARVVerticalScrollHelper 用于将 RecyclerView 滚动到指定位置

效果图与示例 apk

简化 GridView/ListView 适配器 RecyclerView/Header/Footer/拖拽排序
adapterview rv_and_rvbinding
RecyclerView 多 ItemType 吸顶分类索引
rv_multi_item sticky
仿美团外卖点餐界面左右联动
cascade

点击下载 BGABaseAdapterDemo.apk 或扫描下面的二维码安装

BGABaseAdapterDemo apk文件二维码

使用

Gradle 依赖

  • maven { url 'https://jitpack.io' } 添加到 root build.gradle 的 repositories 中
  • 在 app build.gradle 中添加如下依赖,末尾的「latestVersion」指的是徽章Download里的版本名称,请自行替换
implementation 'androidx.recyclerview:recyclerview:latestVersion'
implementation 'com.github.bingoogolapple:BGABaseAdapter-Android:latestVersion'

简化 AdapterView 的子类(如 ListView、GridView)的适配器的编写

AdapterViewAdapter.java

简化 RecyclerView 的适配器的编写

RvAdapter.java

RecyclerView 结合 DataBinding 使用时简化 RecyclerView 的适配器的编写

RvBindingFragment.java

BGADivider 用于简化 RecyclerView 分割线的编写,以及轻松实现基于 RecyclerView 的悬浮分类索引

RvStickyFragment.java

仿美团外卖点餐界面左右联动

RvCascadeFragment.java

代码是最好的老师,详细用法请查看 demo🐾

感谢

关于我

个人主页 邮箱 BGA系列开源库QQ群
bingoogolapple.cn [email protected] BGA_CODE_CLUB

打赏支持

如果您觉得 BGA 系列开源库帮你节省了大量的开发时间,请扫描下方的二维码随意打赏,要是能打赏个 10.24 🐵就太👍了。您的支持将鼓励我继续创作:octocat:

如果您目前正打算购买通往墙外的梯子,可以使用我的邀请码「YFQ9Q3B」购买 Lantern,双方都赠送三个月的专业版使用时间:beers:

License

Copyright 2015 bingoogolapple

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

bgabaseadapter-android's People

Contributors

bingoogolapple avatar gitter-badger 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

bgabaseadapter-android's Issues

显示错位

当一个页面有上下两个recyclerview时候,上面是gridmanager 下面是linmanager ,当页面被销毁(旋转屏幕时),上面grid的就是显示乱, 就是每个item的高度都会变成屏幕的高,上下两个recyclerview的高均设置为 wrap ,用原生的写法是完全没问题的

添加头和尾

添加HeaderView、FooterView ?? 没发现有添加头部和尾部的方法,看能不能加上,

多item

多中不同的item如何实现?

空数据时无法动态添加数据

如果setData(ListData)里的ListData是空List的时候,动态添加数据加不上,但是输出ListData确实是增加条数了。。但是一开始ListData就有数据的话动态添加是毫无问题的。代码来来回回的看了几十遍也没看出来哪的问题,不确定是控件的问题还是我自己代码本身的问题,其他人有遇到过这种情况吗?

demo报错了

2019-03-07 10:33:22.598 4798-4798/cn.bingoogolapple.baseadapter.demo E/AndroidRuntime: FATAL EXCEPTION: main
    Process: cn.bingoogolapple.baseadapter.demo, PID: 4798
    java.lang.NullPointerException: Attempt to read from field 'java.util.List cn.bingoogolapple.baseadapter.demo.model.BannerModel.imgs' on a null object reference
        at cn.bingoogolapple.baseadapter.demo.ui.fragment.RvBindingFragment$8.onResponse(RvBindingFragment.java:214)
        at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
        at android.os.Handler.handleCallback(Handler.java:793)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:173)
        at android.app.ActivityThread.main(ActivityThread.java:6698)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)

混淆

建议可以贴出混淆配置来下。

多条目type的时候局部刷新错位

多条目item与addHeaderView结合的时候,局部刷新notifyItemChanged控制某个view显示隐藏无效--没反应动静;用notifyDataSetChanged全局刷新也无效;用notifyItemChangedWrapper局部刷新错位;麻烦博主给下答复!谢谢

使用该适配器设置嵌套ListView问题

你好,在尝试使用您的适配器库 加载嵌套ListView时,对ViewHolderHelper扩充了一点设置子ListView的方法如下:
/**
*
* @param viewId
* @return
*/
public BGAViewHolderHelper setChildListView(@idres int viewId){
childListView = (ListView) getView(viewId);
return this;
}

/**
 * @param childListViewAdapter
 * @return
 */
public BGAViewHolderHelper setChildListViewAdapter(BGAAdapterViewAdapter childListViewAdapter){
    this.childListView.setAdapter(childListViewAdapter);
    return this;
}

/**
 * 设置子listView 的selector
 * @param drawable
 * @return
 */
public BGAViewHolderHelper setChildListViewSelector(Drawable drawable){
    this.childListView.setSelector(drawable);
    return this;
}

public BGAViewHolderHelper setChildListViewDivider(Drawable divider){
    this.childListView.setDivider(divider);
    return this;
}

public BGAViewHolderHelper setChildListViewDividerHeight(int height){
    this.childListView.setDividerHeight(height);
    return this;
}

/**
 * 在存在子ListView的情况下,子listview填充完数据之后 重新计算父listview高度
 * @return
 */
public BGAViewHolderHelper resetListViewHeight(){
    ViewUtil.setListViewHeightBasedOnChildren(this.childListView);
    return this;
}

在fillData里设置子ListVIew相关信息:
@OverRide
protected void fillData(BGAViewHolderHelper viewHolderHelper, int position, Order model) {
viewHolderHelper.setText(R.id.orderNum,model.getNumber());
viewHolderHelper.setText(R.id.orderType,model.getType());
viewHolderHelper.setText(R.id.custName,model.getUserName());
viewHolderHelper.setText(R.id.custPhone,model.getUserPhone());
viewHolderHelper.setText(R.id.custAddress,model.getUserAddress());
viewHolderHelper.setText(R.id.deliTime, model.getDeliTime());
viewHolderHelper.setText(R.id.deliStatus,model.getDeliStatus());

    _goodsAdapter = new GoodsAdapterTest(_context);//也是继承自BAGAdatperViewAdapter
    _goodsAdapter.setDatas(model.getGoods());
    viewHolderHelper.setChildListView(R.id.goods_list)
             .setChildListViewAdapter(_goodsAdapter)

// .setChildListViewSelector(new ColorDrawable(Color.WHITE))
.setChildListViewDivider(new ColorDrawable(Color.WHITE))
.setChildListViewDividerHeight(1)
.resetListViewHeight();
}现在的疑问是 如何把子ListView的item点击事件 传递到activity,因为子ListView需要多个adapter,直接把_goodsAdapter透给activity行不通,有什么建议吗

建议: BGABaseAdapterUtil 获取 Application时不要调用隐藏 API;改为让调用者传递吧。

BGABaseAdapterUtil 获取 Application时不要调用隐藏 API;
public class BGABaseAdapterUtil {
private static Application sApp;

static {
    Application app = null;
    try {
        app = (Application) Class.forName("android.app.AppGlobals").getMethod("getInitialApplication").invoke(null);
        if (app == null)
            throw new IllegalStateException("Static initialization of Applications must be on main thread.");
    } catch (final Exception e) {
        Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from AppGlobals." + e.getMessage());
        try {
            app = (Application) Class.forName("android.app.ActivityThread").getMethod("currentApplication").invoke(null);
        } catch (final Exception ex) {
            Log.e(BGABaseAdapterUtil.class.getSimpleName(), "Failed to get current application from ActivityThread." + e.getMessage());
        }
    } finally {
        sApp = app;
    }
}

}

建议让调用者传过来吧。这样很容易出问题。

拷贝源码到bgaphotopicker,编译databind出错

由于需要去掉bgaphotopicker的依赖,将bgaadapter 拷贝源码到bgaphotopicker的library中,包名不变,编译databind出错,提示log如下。

D:\AndroidProject\BGAPhotoPicker-Android\library\src\main\java\cn\bingoogolapple\androidcommon\adapter\BGABindingRecyclerViewAdapter.java:91: 错误: 找不到符号
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.viewHolder, viewHolder);
                                                                   ^
  符号:   类 BR
  位置: 程序包 cn.bingoogolapple.androidcommon.adapter
D:\AndroidProject\BGAPhotoPicker-Android\library\src\main\java\cn\bingoogolapple\androidcommon\adapter\BGABindingRecyclerViewAdapter.java:92: 错误: 找不到符号
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.model, model);
                                                                   ^
  符号:   类 BR
  位置: 程序包 cn.bingoogolapple.androidcommon.adapter
D:\AndroidProject\BGAPhotoPicker-Android\library\src\main\java\cn\bingoogolapple\androidcommon\adapter\BGABindingRecyclerViewAdapter.java:93: 错误: 找不到符号
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.itemEventHandler, mItemEventHandler);
                                                                   ^
  符号:   类 BR
  位置: 程序包 cn.bingoogolapple.androidcommon.adapter

错误位置

     B binding = viewHolder.getBinding();
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.viewHolder, viewHolder);
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.model, model);
        binding.setVariable(cn.bingoogolapple.androidcommon.adapter.BR.itemEventHandler, mItemEventHandler);

没有对最新的diffutils支持

您好,27.1.1版本的RecyclerView新增了一个ListAdapter,主是用与RecyclerView的局部更新,从而提高页面刷新效率.希望作者可以扩展一下BGARecyclerViewAdapter支持ListAdapter的功能

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.