GithubHelp home page GithubHelp logo

treerecyclerview's Introduction

2021-3-7更新

1.优化了获取注解的逻辑,减少了读取class的注解的次数

2.ItemManager新增了setTag.getTag方法,可以通过该方法绑定Activity或者Fragment等对象.在TreeItem可以获取该对象

3.TreeItem新增了init方法,可以做一些初始化设置,比如默认是否展开等等

4.新增了getItemOffsets的重写函数,与ItemDecoration接口保持一致(旧的方法依旧保留)

更新

新增androidx分支.转换支持androidX 版本号:v1.3.1-androidx

新增Kotlin版本分支. 版本号v1.3.1-kt

996.icu LICENSE

特点

1.支持实现树形结构列表及大部分列表样式
2.每一种条目的逻辑独立,充分解耦,支持复用
3.支持组件化
4.支持服务器动态下发,动态组合
5.侵入性低,不修改RecyclerView原有特性

示例图:

image image image image image image

以上示例都只使用了一个RecyclerView,没有嵌套

依赖方式

 implementation 'com.github.Jlanglang:TreeRecyclerView:1.3.1.1'

根build.gradle里面添加

 repositories {
     maven { url 'https://jitpack.io' }
 }

如何使用:

一.你需要创建一个adapter:

 //可折叠
 TreeRecyclerAdapter treeRecyclerAdapter = new TreeRecyclerAdapter(TreeRecyclerType.SHOW_EXPAND);

二.你需要选择一种展开方式

public enum TreeRecyclerType {
    /**
     * 显示所有,不可展开折叠
     * 适用场景,不需要折叠,默认显示所有item
     */
    SHOW_ALL,

    /**
     * 根据isExpand的状态显示展开与折叠,
     * 适用场景,多级的data数据展示,保存展开状态
     */
    SHOW_EXPAND,

    /**
     * 默认只显示第一级,点击展开,折叠不会影响子级展开折叠
     * 适用场景,一级一级展开,保存展开状态
     */
    SHOW_DEFAULT
}

构造函数传入,不传默认则使用SHOW_DEFAULT.

三.怎么写Item

注意! 使用这个,没有写ViewHolder的概念,只有TreeItemTreeItemGroup.子级和父级.

父级示例:

/**
* 城市
 */
public class CountyItemParent extends TreeItemGroup<ProvinceBean.CityBean> {//泛型代表绑定的javabean

    //创建子TreeItem.
    @Override
    public List<TreeItem> initChildList(ProvinceBean.CityBean data) {
        return ItemHelperFactory.createItems(data.getAreas(),  this);
    }

    //该级具体展示的Layout
    @Override
    public int getLayoutId() {
        return R.layout.item_two;
    }

    //view和data绑定
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder) {
        holder.setText(R.id.tv_content, data.getCityName());
    }
}

子级示例:

/**
* 县
 */
public class AreaItem extends TreeItem<ProvinceBean.CityBean.AreasBean> {//泛型代表绑定的javabean

    @Override
    public int getLayoutId() {
        return R.layout.item_three;
    }
    //绑定操作,
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder) {
        holder.setText(R.id.tv_content, data.getAreaName());
    }
    //这个Item,在RecyclerView的每行所占比,只有RecyclerView设置了GridLayoutManager才会生效.
    //这里之所以用除法,是为了可以做到,只改变GridLayoutManager的总数,无需改变每个Item,当然也可以直接返回一个int值.
    @Override
    public int getSpanSize(int maxSpan) {
        return maxSpan / 6;
    }
}

怎么创建Item:

有两种方法:

第一种:

在javabean上使用注解,

 @TreeDataType(iClass = AreaItem.class)
  public class AreasBean{
  ...
  }

然后传入bean对象

 ItemHelperFactory.createItems(list,  treeItemGroup);

第二种:

直接传入bean对象和item的class,

 ItemHelperFactory.createItems(list, Item.class, treeItemGroup);

四.如何更新adapter:

增删该查都有.

treeRecyclerAdapter.getItemManager().replaceAllItem(items);// 替换全部Item
treeRecyclerAdapter.getItemManager().addItems(items);// 添加一组Item
treeRecyclerAdapter.getItemManager().removeItems(items);// 添加一组Item

在item里面也是可以更新的:

    @Override
    public void onClick(ViewHolder viewHolder) {
        super.onClick(viewHolder);
        getItemManager().notifyDataChanged();
    }

五,如何设置Item点击:

1.重写TreeItemonClick()

2.adapter设置setOnItemClickListener

 adapter.setOnItemClickListener(new BaseRecyclerAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(@NonNull ViewHolder viewHolder, int position) {

            }
        });
注意.二者冲突.

ItemClickListener优先级高于TreeItemonClick.

如果不想写上面的Item类怎么办?

使用SimpleTreeItem

 ArrayList<TreeItem> items = new ArrayList<>();
        for (Pair itemPair : itemPairs) {
            SimpleTreeItem simpleTreeItem = new SimpleTreeItem(R.layout.item_mine)//传入布局id.
                    .onItemBind(viewHolder -> {

                    })
                    .onItemClick(viewHolder -> {

                    });
            simpleTreeItem.setData(itemPair);
            items.add(simpleTreeItem);
        }
 adapter.getItemManager().replaceAllItem(items);

混淆

-keep public class * extends  com.baozi.treerecyclerview.item.TreeItem {}
-keep public class * extends android.support.annotation.**

最后

直接设置就行了.adapter可以不先setData 可以直接setAdapter.然后adapter.getItemManager().replaceAllItem(items);

 recyclerView.setAdapter(adapter);

更多效果.见demo

欢迎大家留言,提出问题. QQ交流群:493180098

treerecyclerview's People

Contributors

jlanglang 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

treerecyclerview's Issues

点击事件问题

我发现接口回调的点击事件,只支持最后一级的item,假如他是123级的item,部分有3级部分只有2级,我点2级的时候怎么获取点击事件呢

是否支持多类型?

我想在 TreeItemGroup 或者 TreeItem 中使用 ViewType,添加 Header 和 Footer,但没找到相关的方法

发现两个问题

侧滑view的显示与隐藏不稳定,尤其是按住父view滑动时最明显;子view的排序问题,表层数据改变了,底部数据添加一条直接加在最后

三级城市点击就闪退了,日志如下,估计是字符串数据格式对不上,解析异常了,但是没看到在哪

2019-05-07 17:23:29.023 30128-30200/com.baozi.treerecyclerview E/AndroidRuntime: FATAL EXCEPTION: Thread-6
Process: com.baozi.treerecyclerview, PID: 30128
com.alibaba.fastjson.JSONException: error parse set
at com.alibaba.fastjson.parser.JSONLexerBase.scanSet(JSONLexerBase.java:2794)
at com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:165)
at com.alibaba.fastjson.parser.JSONLexerBase.nextToken(JSONLexerBase.java:359)
at com.alibaba.fastjson.parser.DefaultJSONParser.(DefaultJSONParser.java:179)
at com.alibaba.fastjson.parser.DefaultJSONParser.(DefaultJSONParser.java:154)
at com.alibaba.fastjson.JSON.parseArray(JSON.java:347)
at com.baozi.demo.activity.CityListActivity$1.run(CityListActivity.java:42)

支持动态修改数据源吗?

比如有数据{A:[1, 2, 3], B:[4,5, 6, 7]}。界面用分段控件显示A和B标题,点击可以切换显示A或者B的数据源,同时不改变展开状态。这种情况可以做到吗?

城市列表 展开时动画

你好,我最近在做一个和你城市列表相同的功能,但是做到展开动画时卡住了。楼主能不能在你的项目中加入展开和收起的动画供参考下。 十分感谢!!!!!

刷新问题

当我在onBindViewHolder 中调用 getItemManager().notifyDataChanged()刷新出现 Cannot call this method while RecyclerView is computing a layout or scrolling androidx.recyclerview.widget.RecyclerView错误

添加demo演示

楼主添加的演示是对自己成果的一种展示,一种推销,别人一看到就可以立马定位自己的需求,谢谢

混淆问题

混淆时需要加入这些
-keep class * extends com.baozi.treerecyclerview.{;}
-keep class * extends com.baozi.treerecyclerview.item.{;}
-keep class com.baozi.treerecyclerview.{;}

extend TreeItem 的 类,需要定义 一个不带参数的 constructor.
否则展示不出来。

局部刷新

怎么局部刷新子item
或者是怎么知道当前条目在父布局的第几个条目上

java.lang.NullPointerException

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object[] java.util.Collection.toArray()' on a null object reference
at java.util.ArrayList.addAll(ArrayList.java:228)
at com.baozi.treerecyclerview.item.TreeItemGroup.onExpand(TreeItemGroup.java:68)
at com.baozi.treerecyclerview.item.TreeItemGroup.setExpand(TreeItemGroup.java:45)
at com.baozi.treerecyclerview.adpater.TreeRecyclerAdapter$1.onClick(TreeRecyclerAdapter.java:57)
at android.view.View.performClick(View.java:4790)
at android.view.View$PerformClick.run(View.java:19924)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5418)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

我在使用三级列表的时候,点击偶尔会报错,我在源码处判空,也没得到解决,还是会报错!求解决!!!

不能直接通过数据源移除吗?

如题,我对数据源的数据移除,没有效果:

list.remove(2);
adapter.getItemManager().notifyDataChanged();

只能用库提供的 removeItems() 方法移除吗?

在不需要使用多级功能的地方,能否使用该库?

如题,假如我不需要用到多级功能,是否可以直接封装成 TreeItem 传进去?

我尝试了这种方式,代码如下:

@TreeDataType(iClass = AccountItem.class)
public class Account  {}

public class AccountItem extends TreeItem<Account> {}

public class AccountFragment extends Fragment {
    private final TreeRecyclerAdapter adapter = new TreeRecyclerAdapter();
    LinearLayoutManager manager = new LinearLayoutManager(requireContext());
    recyclerView.setLayoutManager(manager);
    ...
    private void notifyList(List<Account> list) {
        List<TreeItem> items = ItemHelperFactory.createItems(list);
        adapter.getItemManager().replaceAllItem(items);
    }
}

似乎没办法正常显示

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.