Skip to content

walkermanx/abstractlistadapters

Repository files navigation

Abstractlistadapters: 简单好用的列表控件数据适配器

abstractlistadapters 简书个人页

该适配器可为ListViewGridViewRecyclerView提供数据适配,通过使用抽象类和java泛型机制继承传统适配器类,将重复性代码整体封装,在保存ViewHolder缓存机制的前提下,将适配器的核心功能代码逻辑剥离,使得我们只需要通过编写继承于BaseItemView<T>的派生类即可完成数据的适配。大大减少了冗余代码的编写工作,让我们能将时间和精力聚焦于核心业务逻辑的编写从而提高编码效率。

核心类及说明:

  • BaseRecyclerAdapter<T> :用于对RecyclerView的数据适配
  • ModeListAdapter<T> :用于对ListViewGridView 的数据适配
  • BaseItemView<T> :适用于BaseRecyclerAdapter<T>ModeListAdapter<T>的通用Item布局类,该类承担了Item视图业务和数据处理业务的整合。通过编写该类的派生类可以定制化的实现各种Item视图以及对应的数据展示

引入:

1. 在项目的根目录中找到 build.gradle 文件 (不是module的build.gradle 文件 ),加入如下代码:

allprojects {
    repositories {
        maven {
            url 'https://raw.githubusercontent.com/walkermanx/mvn-repo/master/Android/Lib/abstractlistadapters/'
        }
    }
}

2. 在你的项目module的build.gradle 文件中引入依赖:

 //建议AndroidStudio3.0以上版本 根据需要使用implementation或者api方式引入依赖
 implementation 'com.walkermanx:abstractlistadapters:0.0.1'
 //AndroidStudio3.0以下版本
 compile 'com.walkermanx:abstractlistadapters:0.0.1'

使用示例:

1. 编写BaseItemView<T>的派生类,实现自定义的视图业务

  • 编写自定义的Item Layout布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <merge xmlns:android="http://schemas.android.com/apk/res/android">
        <TextView
            android:id="@+id/tv_title"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="仓库A"
            android:textColor="@color/txt_color_black"
            android:textSize="@dimen/y18" />
    </merge>
  • 编写BaseItemView<T>的派生类:

    public class AtomBeanItemView extends BaseItemView<Atombean> {
    
        TextView tv_title;
        public AtomBeanItemView(Context context) {
            this(context, null);
        }
        public AtomBeanItemView(Context context, AttributeSet attrs) {
            super(context, attrs);
            inflate(context, R.layout.item_warehouse, this);
            tv_title = (TextView) findViewById(R.id.tv_title);
        }
    
        @Override
        public void setModel(Atombean model) {
            super.setModel(model);
            tv_title.setText(model.getName());
        }
    
        @Override
        public void setPosition(int position, int sum) {
            super.setPosition(position, sum);
        }
    
        @Override
        public void setSelected(boolean b) {
            if (b) {
                setBackgroundColor(0xffdde6fa);
                tag.setVisibility(VISIBLE);
                tv_title.setTextColor(0xff5A87EA);
            } else {
                setBackgroundColor(0xfff4f4f4);
                tag.setVisibility(GONE);
                tv_title.setTextColor(0xff000000);
            }
        }
    }

2. 示例:

  • ListViewGridView

    ListView listView = (ListView) findViewById(R.id.list);
      listView.setAdapter(new ModeListAdapter<AtomBean>(this) {
           @NonNull
           @Override
           protected BaseItemView GetCurrentModelItemViewInstanceByViewType(Context context, int viewType) {
              return new AtomBeanItemView(context);
           }
    
           //如果item需要根据ViewType做不同的视图加载,则需要重写getItemViewType 和 getViewTypeCount 方法即可 否则只需要重写GetCurrentModelItemViewInstanceByViewType即可
    
           // getItemViewType返回的数值其取值必须在getViewTypeCount返回的数值之内。
           // 也就是如果getViewTypeCount返回的数值是3,
           // 那么getItemViewType返回的数值就必须是0,1,2三个中的一个 否则无效
           @Override
           public int getItemViewType(int position) {
               return super.getItemViewType(position);
           }
    
           @Override
           public int getViewTypeCount() {
               return super.getViewTypeCount();
           }
           
       });

  • RecyclerView

     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list);
     recyclerView.setAdapter(new BaseRecyclerAdapter<AtomBean>() {
                @NonNull
                @Override
                protected BaseItemView GetCurrentModelItemViewInstanceByViewType(Context context, int viewType) {
                    return new AtomBeanItemView(context);
                }
    
                //如果item需要根据ViewType做不同的视图加载,则需要重写该方法 否则只需要重写GetCurrentModelItemViewInstanceByViewType即可
                @Override
                protected int itemViewType(int pos) {
                    return super.itemViewType(pos); 
                }
            });

感谢

后记:

About

this is a highly abstract list adapter for listview/gridview/recycleview widgets.it is really easy and efficient for fast develop apps.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages