All Projects → xuehuayous → Delegationadapter

xuehuayous / Delegationadapter

Licence: apache-2.0
一种优雅的方式来使用RecyclerView

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to Delegationadapter

Timeline View
Android Timeline View is used to display views like Tracking of shipment/order, steppers etc.
Stars: ✭ 3,553 (+830.1%)
Mutual labels:  recyclerview
Corbind
Kotlin Coroutines binding APIs for Android UI widgets from the platform and support libraries
Stars: ✭ 357 (-6.54%)
Mutual labels:  recyclerview
Klaster
Declare RecyclerView adapters in a functional way, without boilerplate and subclassing. No compromises on flexibility. If it's possible to do something by subclassing, it's possible to do it with this library.
Stars: ✭ 373 (-2.36%)
Mutual labels:  recyclerview
Giraffeplayer2
out of the box android video player(support lazy load, ListView/RecyclerView and hight performance)
Stars: ✭ 344 (-9.95%)
Mutual labels:  recyclerview
Recyclerviewitemdecorations
ItemDecoration for Android Recyclerview
Stars: ✭ 351 (-8.12%)
Mutual labels:  recyclerview
Imageviewer
🔮图片浏览器,支持图片手势缩放、拖拽等操作,`自定义View`的模式显示,自定义图片加载方式,更加灵活,易于扩展,同时也适用于RecyclerView、ListView的横向和纵向列表模式,最低支持版本为Android 3.0及以上...
Stars: ✭ 363 (-4.97%)
Mutual labels:  recyclerview
Horizontalpicker
A simple, customizable and easy to use picker where centre view is scaled up
Stars: ✭ 337 (-11.78%)
Mutual labels:  recyclerview
Adapter
A quick adapter library for RecyclerView, GridView, ListView, ViewPager, Spinner
Stars: ✭ 376 (-1.57%)
Mutual labels:  recyclerview
Androidproject
Android 技术中台,但愿人长久,搬砖不再有
Stars: ✭ 4,398 (+1051.31%)
Mutual labels:  recyclerview
Familiarrecyclerview
一个如你熟悉ListView、GridView一样熟悉的RecyclerView
Stars: ✭ 372 (-2.62%)
Mutual labels:  recyclerview
Recyclerlistview
High performance listview for React Native and web!
Stars: ✭ 4,033 (+955.76%)
Mutual labels:  recyclerview
Brv
Android上最强大的RecyclerView库
Stars: ✭ 345 (-9.69%)
Mutual labels:  recyclerview
Android Extensions
An Android library with modules to quickly bootstrap an Android application.
Stars: ✭ 356 (-6.81%)
Mutual labels:  recyclerview
Stacklayoutmanager
customized layoutmanager,let item pile up like stackview/类似最美有物卡片堆叠效果
Stars: ✭ 343 (-10.21%)
Mutual labels:  recyclerview
Y divideritemdecoration
A common RecyclerView divider , supports the LinearLayoutManager and the GridLayoutManager.
Stars: ✭ 373 (-2.36%)
Mutual labels:  recyclerview
Recycler View Divider
A library which configures a divider for a RecyclerView.
Stars: ✭ 338 (-11.52%)
Mutual labels:  recyclerview
Multichoicerecyclerview
Multi choice selection applied on recycler view make life easier
Stars: ✭ 361 (-5.5%)
Mutual labels:  recyclerview
Multiitem
一个优雅的实现多类型的RecyclerView类库 支持DataBinding Form表单录入 跨多个RecyclerView拖动
Stars: ✭ 381 (-0.26%)
Mutual labels:  recyclerview
Stackcardlayoutmanager
Stars: ✭ 376 (-1.57%)
Mutual labels:  recyclerview
Dragselectrecyclerview
TouchListener that can be attached to any RecyclerView and handles multi selection for you
Stars: ✭ 371 (-2.88%)
Mutual labels:  recyclerview

一种优雅的方式来使用RecyclerView

使得RecyclerView各种情况的多类型条目更简单!

License JCenter MinSdk

示例图片

下载体验

核心思想

  想必大家都遇到过,在一个列表中显示不同样式的需求。在RecyclerView中可以通过ViewType进行区分,如果样式特别多的时候就会使得代码非常冗余,不利于开发及维护。那么有没有一种优雅的方法解决这个问题呢?

  技术经理给你说,接下来的项目由你负责,明天下班前把排期同步出来。这时你应该怎么做?由于你是Android端的RD,你对Android的排期是比较了解的,但是iOS端、FE端、Server端的排期怎么办呢?聪明的你立即把任务派发下去了,给每个端的负责人说,明天中午之前把排期汇总给我。

  没错,在多样式列表的设计中也可以采用这种策略,给RecyclerView设置的Adapter不做具体的处理,而是由它派发出去。

实现方案

  1. addDelegate 向Adapter中注册委托Adapter;
  2. addDataList 设置数据;
  3. layout 渲染布局,Adapter查找到对应的委托Adapter,由委托Adapter去做具体渲染。

引入

androidX

implementation 'com.kevin:delegationadapter:2.0.4'
// 扩展库,扩展支持了item click、item long click、databinding、load more
implementation 'com.kevin:delegationadapter-extras:2.0.4'

support

implementation 'com.kevin:delegationadapter:1.2.1'
// 扩展库,扩展支持了item click、item long click、databinding、load more
implementation 'com.kevin:delegationadapter-extras:1.2.1'

如何使用

简单用法

  1. 带RecyclerView的布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
    </LinearLayout>
    
  2. 初始化RecyclerView

    Adapter为DelegationAdapter,然后向DelegationAdapter中注册委托Adapter。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = findViewById(R.id.recycler_view);
        // ① 设置 LayoutManager
        // LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        GridLayoutManager layoutManager = new GridLayoutManager(this, 3);
        recyclerView.setLayoutManager(layoutManager);
        // ② 创建 DelegationAdapter 对象
        DelegationAdapter delegationAdapter = new DelegationAdapter();
        // ③ 向Adapter中注册委托Adapter
        delegationAdapter.addDelegate(new CompanyAdapterDelegate());
        // ④ 设置Adapter
        recyclerView.setAdapter(delegationAdapter);
    }
    
  3. 委托Adapter编写

    委托Adapter继承自AdapterDelegate,需要两个泛型,第一个为该委托Adapter可处理数据的数据类型(这里为String),第二个参数为ViewHolder。剩下的就按照之前怎么写Adapter来写委托Adapter就可以啦。比如:在onCreateViewHolder创建ViewHolder,在onBindViewHolder中绑定数据到视图控件。

    public class CompanyAdapterDelegate extends AdapterDelegate<String, CompanyAdapterDelegate.ViewHolder> {
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position, final String item) {
            holder.tvName.setText(item);
        }
    
        static class ViewHolder extends RecyclerView.ViewHolder {
            public TextView tvName;
    
            public ViewHolder(View itemView) {
                super(itemView);
                tvName = itemView.findViewById(android.R.id.text1);
            }
        }
    }
    
  4. 设置数据

    protected void onCreate(Bundle savedInstanceState) {
        // ... ...
    
        List<String> companies = new ArrayList<>();
        companies.add("🇨🇳 Baidu");
        companies.add("🇨🇳 Alibaba");
        companies.add("🇨🇳 Tencent");
        companies.add("🇺🇸 Google");
        companies.add("🇺🇸 Facebook");
        companies.add("🇺🇸 Microsoft");
        // ⑤ 设置数据
        delegationAdapter.setDataItems(companies);
    }
    

复杂用法

如果想区分🇨🇳公司为红色,美国公司为蓝色,怎么办呢?

  1. 编写CNCompanyAdapterDelegate

    public class CNCompanyAdapterDelegate extends AdapterDelegate<String, CNCompanyAdapterDelegate.ViewHolder> {
    
        @Override
        public boolean isForViewType(String item, int position) {
            return item.contains("🇨🇳");
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position, final String item) {
            holder.tvName.setText(item);
            holder.tvName.setTextColor(Color.RED);
        }
        
        static class ViewHolder extends RecyclerView.ViewHolder {
            public TextView tvName;
    
            public ViewHolder(View itemView) {
                super(itemView);
                tvName = itemView.findViewById(android.R.id.text1);
            }
        }
    }
    
  2. 编写USCompanyAdapterDelegate

    public class USCompanyAdapterDelegate extends AdapterDelegate<String, USCompanyAdapterDelegate.ViewHolder> {
    
        @Override
        public boolean isForViewType(String item, int position) {
            return item.contains("🇺🇸");
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent) {
            View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, final int position, final String item) {
            holder.tvName.setText(item);
            holder.tvName.setTextColor(Color.BLUE);
        }
    
        static class ViewHolder extends RecyclerView.ViewHolder {
            public TextView tvName;
    
            public ViewHolder(View itemView) {
                super(itemView);
                tvName = itemView.findViewById(android.R.id.text1);
            }
        }
    }
    
  3. 注册委托Adapter

// 向Adapter中注册委托Adapter
delegationAdapter.addDelegate(new CNCompanyAdapterDelegate());
delegationAdapter.addDelegate(new USCompanyAdapterDelegate());

更多请看示例

THANKS TO

  1. MultiItem 委托思想来源
  2. AdapterDelegates 委托架子来源
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].