简化 RecyclerView 的多种 type 的 adapter,Fragment 可以动态添加到 RecyclerView 上,实现复杂的界面分多个模块开发
2016-11-07 10:19
459 查看
MultiTypeView
项目地址:LuckyJayce/MultiTypeView简介:简化 RecyclerView 的多种 type 的 adapter,Fragment 可以动态添加到 RecyclerView 上,实现复杂的界面分多个模块开发
1.简化 RecyclerView 的多种 type 的 adapter
2.ViewHolder 的创建和绑定被提取出来变成 ItemViewProvider,可以被多个 adapter 复用
3.支持一种数据对应多种 ItemViewProvider
4.Fragment 可以添加到 RecyclerView 上,实现复杂的界面
对于复杂的界面非常有利,一个复杂的界面可以分成多个 Fragment,一个项目组分配给多个人开发.5.RecyclerView 上的 Fragment 是显示时候才加载
具有懒加载的效果.假设 RecyclerView 上放了 10 个 Fragment,你进去的时候只加载到开始的 1,2 个 Fragment6.支持全局注册 ItemViewProvider,和局部注册,和局部覆盖注册.
7.列表的数据保存和恢复,以及 fragment 的保存和恢复
Download sample Apk效果图
关系图
使用方法
实现 ItemViewProviderpublic class MessageLeftProvider extends ItemViewProvider<Message> { @Override public RecyclerView.ViewHolder onCreateViewHolder(LayoutInflater inflater, ViewGroup parent, int providerType) { return new ItemViewHolder(inflater.inflate(R.layout.item_message_left, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, Message message) { ItemViewHolder vh = (ItemViewHolder) viewHolder; vh.textView.setText(message.text); } private class ItemViewHolder extends RecyclerView.ViewHolder { private final TextView textView; public ItemViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(R.id.item_message_textView); } } }Activity 代码
public class LongPageActivity extends AppCompatActivity { private MultiTypeAdapter<Object> multiTypeAdapter; private MultiTypeView multiTypeView; private String myUserId = "1"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_long_page); multiTypeView = (MultiTypeView) findViewById(R.id.multiTypeView); //带有 FragmentManager 的构造函数,默认帮您添加支持 Fragment 数据的 FragmentHolderProvider //也就是说你可以把 Fragment 放在 adapter 上使用,这里的 Fragment 只有第一次滑动到对应位置才会 onCreateView 的方法 ItemBinderFactory itemBinderFactory = new ItemBinderFactory(getSupportFragmentManager()); //有时候需要根据 TextItem 里面的某个字段,生成不同的布局.比如聊天界面的 message 是一样的,但是有区分左右布局 //ItemProviderSet 可以通过数据类型区分无数种情况的 Provider itemBinderFactory.registerProvider(Message.class, new ItemViewProviderSet<Message>(new MessageProvider(MessageProvider.ALIGN_LEFT), new MessageProvider(MessageProvider.ALIGN_RIGHT)) { @Override protected int selectIndex(Message message) { return myUserId.equals(message.userId) ? 1 : 0; } }); multiTypeAdapter = new MultiTypeAdapter<>(loadData(0), itemBinderFactory); multiTypeView.setAdapter(multiTypeAdapter); } private List<Object> loadData(int page) { List<Object> data = new ArrayList<>(); TextView textView = new TextView(this); textView.setText("第" + page + "页"); textView.setGravity(Gravity.CENTER); textView.setBackgroundColor(Color.GRAY); textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dipToPix(this, 100))); data.add(textView); data.add(new Message("1", "今天这个状态有所保留么?")); data.add(new Message("2", "没有保留!我已经,我已经用了洪荒之力啦!")); data.add(new FragmentData(InfoLazyFragment.class, "InfoLazyFragment" + page)); data.add(new FragmentData(EditLazyFragment.class, "EditLazyFragment" + page)); data.add(new FragmentData(HotelLazyFragment.class, "HotelLazyFragment" + page)); data.add(new FragmentData(AirlineTicketLazyFragment.class, "AirlineTicketLazyFragment" + page)); data.add(new FragmentData(ShopLazyFragment.class, "ShopLazyFragment" + page)); data.add(new FragmentData(RecommendLazyFragment.class, "RecommendLazyFragment" + page)); data.add(new FragmentData(FoodLazyFragment.class, "FoodLazyFragment" + page)); data.add(new FragmentData(CultureLazyFragment.class, "CultureLazyFragment" + page)); this.page = page; return data; } }
很简单吧,三个步骤
1.实现 ItemViewProvider 并注册到 ItemBinderFactory 上2.然后设置 MultiTypeAdapter3.添加数据Gradle
compile 'com.shizhefei:MultiTypeView:1.0.1' 由于用到了 v4 和 recyclerview 所以也要导入他们 compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:recyclerview-v7:23.2.1'
说明
本项目是根据 https://github.com/drakeet/MultiType 类库的想法把 ViewHolder 的创建以 ItemViewProvider 的形式分离出来 ,以及参考了部分代码实现.之后我添加了 Fragment 添加到 RecyclerView 上功能,以及 view 以数据的形式也可以添加上去.还有就是全局注册和局部注册的方案,ItemViewProviderSet 实现了相同数据类型不同的 ItemViewProvider.非常感谢 @drakeet
主力类库
1.https://github.com/LuckyJayce/ViewPagerIndicatorIndicator 取代 tabhost,实现网易顶部 tab,新浪微博主页底部 tab,引导页,无限轮播 banner 等效果,高度自定义 tab 和特效2.https://github.com/LuckyJayce/MVCHelper
实现下拉刷新,滚动底部自动加载更多,分页加载,自动切换显示网络失败布局,暂无数据布局,支持任意 view,支持切换主流下拉刷新框架。3.https://github.com/LuckyJayce/MultiTypeView
简化 RecyclerView 的多种 type 的 adapter,Fragment 可以动态添加到 RecyclerView 上,实现复杂的界面分多个模块开发4.https://github.com/LuckyJayce/EventBus
事件总线,通过动态代理接口的形式发布,接收事件。定义一个接口把事件发给注册并实现接口的类5.https://github.com/LuckyJayce/LargeImage
大图加载,可供学习6.https://github.com/LuckyJayce/GuideHelper
新手引导页,轻松的实现对应的 view 上面的显示提示信息和展示功能给用户有了这些类库,让你 6 的飞起
相关文章推荐
- 封装RecyclerView Adapter 实现可添加多个header和footer,可设置loadingView,低耦合的多种布局。
- fragment中添加ViewPager实现界面切换,动态添加radiobutton
- ViewPager 结合Fragment实现一个Activity里包含多个可滑动的标签页,每个标签页可以有独立的布局及响应。
- 某宅的Android学习笔记(三)——用ViewPager与FragmentPagerAdapter实现可以滑动的Tab
- 复杂RecyclerView的实现(添加底部瀑布流效果)
- ViewPager+Fragment实现Tabhost,动态添加删除Fragment,可供第三方使用的类库
- Android开发-动态添加与button响应(手机拨号界面的实现)
- (4.1.45.2)RecyclerView实现带header的GridView效果:添加viewType方式
- ViewPager嵌套RecycleView(Fragment作为数据源)来展示10条数据,每个Item显示的内容是(Android软件开发工程师)(用自定义的Adapter 实现
- RecyclerView实现多种Item,最优雅的方式,getItemViewType(以即时通讯app为例子)
- ViewPager+Fragment实现Tabhost,动态添加删除Fragment,可供第三方使用的类库
- ViewPager+Fragment实现TabHost,Fragment动态添加、删除,Tab选项卡跟随滑动
- base-adapter-helper之recyclerview版本,支持多种viewtype布局
- 使用RecyclerView实现动态添加头布局,脚布局
- MultiType-Adapter 优雅的实现RecyclerVIew中的复杂布局
- 用RecyclerView实现动态添加本地图片
- 安卓开发--应用市场的界面制作(一)--viewpager+fragment实现可滑动的底部导航栏
- Android:详情界面左右滑动看更多,ViewPager动态添加Fragment,仿51job详情界面
- ViewPager实现TabHost动态添加、删除Fragment,用红色小圆球指示当前页面
- 解决Android开发中ViewPager动态设置PagerAdapter时第二次进入Fragment内容不显示的问题