安卓框架搭建(七)BaseAdapter的封装

在框架中 直接引用写好的 开源库YcBaseAdapter ,此开源库只实现了简单的条目 及下拉和加载更多 , 如有复杂的条目(多种类型条目等),欢迎去下载YcBaseAdapter开源库进行修改并提交 ,YcBaseAdapter开源库地址 

下面我先介绍一下 如何在框架中直接引用开源库, 如果想知道具体YcBaseAdapter的实现原理 可跳转到 RecyclerView的 BaseAdapter的封装  中有具体的详细介绍

首先直接在  config.gradle 中 类似引入YcAndroidUtils  一样 将YcBaseAdapter引入到框架中

//文件内部使用
def butterknifeLatestReleaseVersion = '8.5.1' //butterknife插件的版本
def supportLibraryVersion = '27.1.1'
//外部使用的安卓版本相关
ext {
    applicationId = 'com.yc.androidarchitecture'
    compileSdkVersion = 27
    targetSdkVersion = 27
    minSdkVersion = 19
    buildToolsVersion = "27.1.1"
    versionCode = 0
    versionName = "1.0.0"
}

//compile依赖的第三方库
ext.deps = [
        supportv4                  : "com.android.support:support-v4:$supportLibraryVersion",
        supportv7                  : "com.android.support:appcompat-v7:$supportLibraryVersion",
        recyclerviewv7             : "com.android.support:recyclerview-v7:$supportLibraryVersion",
        constraintlayout           : 'com.android.support.constraint:constraint-layout:1.1.2',
//增加butterknife 插件相关的库 (版本用内部定义的方式,方便管理)
        butterknife                : "com.jakewharton:butterknife:$butterknifeLatestReleaseVersion",
        butterknifeCompiler        : "com.jakewharton:butterknife-compiler:$butterknifeLatestReleaseVersion",
        YcAndroidUtils             : 'com.yc:YcAndroidUtils:1.1.7',
//引入yc:YcBaseAdapter 插件
        YcBaseAdapter              : 'com.yc:YcBaseAdapter:1.0.0',
        design                     : "com.android.support:design:$supportLibraryVersion",

        rxjava                     : "io.reactivex.rxjava2:rxjava:2.1.1",
        rxandroid                  : "io.reactivex.rxjava2:rxandroid:2.0.1",
        retrofit                   : "com.squareup.retrofit2:retrofit:2.3.0",
        retrofit2_converter_gson   : "com.squareup.retrofit2:converter-gson:2.3.0",
        retrofit2_adapter_rxjava2  : "com.squareup.retrofit2:adapter-rxjava2:2.3.0",
        okhttp3_logging_interceptor: "com.squareup.okhttp3:logging-interceptor:3.10.0",
]

然后在commonlibrary 公共库中 将插件以api的形式 加载

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    api deps.supportv7
    api deps.constraintlayout
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation deps.butterknife
    annotationProcessor deps.butterknifeCompiler
    api files('libs/tbs_sdk_thirdapp_20180608.jar')
    api deps.YcAndroidUtils
//以api的形式 引入YcBaseAdapter 库插件
    api deps.YcBaseAdapter
    api deps.design
    api deps.rxjava
    api deps.rxandroid
    api deps.retrofit
    api deps.retrofit2_converter_gson
    api deps.retrofit2_adapter_rxjava2
    api deps.okhttp3_logging_interceptor
}

下面介绍一下用法

首先是布局文件 跟正常的没什么区别 就是一个 RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".OneItemActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tv_no_loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/colorPrimaryDark"
            android:padding="10dp"
            android:text="禁止加载更多"
            android:textColor="@color/white" />

        <TextView
            android:id="@+id/tv_is_loading"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@color/colorAccent"
            android:padding="10dp"
            android:text="启动加载更多" />

        <TextView
            android:id="@+id/tv_loadMoreEnd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="加载结束隐藏动画" />
    </LinearLayout>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbars="vertical">

    </android.support.v7.widget.RecyclerView>
</LinearLayout>

在界面中的使用方法如下

public class OneItemActivity extends AppCompatActivity {
    @BindView(R.id.recyclerView)
    RecyclerView mRecyclerView;
    @BindView(R.id.tv_no_loading)
    TextView mTvNoLoading;
    @BindView(R.id.tv_is_loading)
    TextView mTvIsLoading;
    @BindView(R.id.tv_loadMoreEnd)
    TextView mTvLoadMoreEnd;
    private List<String> data = new ArrayList<>();
    private YcCommonBaseAdapter adapter;
    boolean loadMoreEnd = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one_item);
        ButterKnife.bind(this);


        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layoutManager);
        adapter = new RefreshAdapter(this);
        //设置 空布局
        adapter.setEmptyView();
        mRecyclerView.setAdapter(adapter);
        //设置是否开启加载更多
        adapter.setEnableLoadMore(true);

        //设置加载更多的监听
        adapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(boolean isReload) {
                //模拟网络请求加载数据
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        getData();
                        Log.d("test", "load more completed");

                    }
                }, 2000);
            }
        });
        //添加头布局
        View headerView = getHeaderView(0, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //点击添加头布局
                adapter.addHeaderView(getHeaderView(1, getRemoveHeaderListener()), 0);
            }
        });
        //将头布局文件添加到适配器中
        adapter.addHeaderView(headerView);

        //脚布局
        View footerView = getFooterView(0, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.addFooterView(getFooterView(1, getRemoveFooterListener()), 0);
            }
        });
        //添加脚布局到适配器中
        adapter.addFooterView(footerView, 0);

        //延时3s刷新列表
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                List<String> data = new ArrayList<>();
                for (int i = 0; i < 1; i++) {
                    data.add("item--" + i);
                }
                //刷新数据
                adapter.setNewData(data);
                adapter.loadMoreEnd(STATUS_END_GONE);
                //                TextView t1 = new TextView(OneItemActivity.this);
                //                t1.setText("我是header-1");
                //                adapter.addHeaderView(t1);
                //                TextView t2 = new TextView(OneItemActivity.this);
                //                t2.setText("我是header-2");
                //                adapter.addHeaderView(t2);
                //                adapter.notifyDataSetChanged();
            }
        }, 2000);


    }

    //添加头布局的方法
    private View getHeaderView(int type, View.OnClickListener listener) {
        View view = getLayoutInflater().inflate(R.layout.top_view, (ViewGroup) mRecyclerView.getParent(), false);
        TextView textView = (TextView) view.findViewById(R.id.tv_header);
        textView.setText("这是头布局");
        if (type == 1) {
            textView.setText("这是添加头布局");
        }
        view.setOnClickListener(listener);
        return view;
    }

    //移除头布局的监听
    private View.OnClickListener getRemoveHeaderListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.removeNormalHeaderView(v);
            }
        };
    }

    //添加脚布局的方法
    private View getFooterView(int type, View.OnClickListener listener) {
        View view = getLayoutInflater().inflate(R.layout.top_view, (ViewGroup) mRecyclerView.getParent(), false);
        TextView textView = (TextView) view.findViewById(R.id.tv_header);
        textView.setText("这是脚布局");
        if (type == 1) {
            textView.setText("这是添加脚布局");
        }
        view.setOnClickListener(listener);
        return view;
    }

    //移除脚布局的监听
    private View.OnClickListener getRemoveFooterListener() {
        return new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                adapter.removeFooterView(v);
            }
        };
    }

    private int mInt = 10;

    /**
     * 获取测试数据
     */
    private void getData() {
        if (mInt < 20) {
            data.clear();
            for (int i = 0; i < 10; i++) {
                data.add("加载条目 : " + i);
            }
            mInt += 10;
            adapter.setLoadMoreData(data);
        } else {
            //            adapter.loadMoreComplete();
            adapter.loadMoreEnd(STATUS_DEFAULT);
        }
    }

    @OnClick({R.id.tv_no_loading, R.id.tv_is_loading, R.id.tv_loadMoreEnd})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.tv_no_loading:
                adapter.setEnableLoadMore(false);
                break;
            case R.id.tv_is_loading:
                adapter.setEnableLoadMore(true);
                break;
            case R.id.tv_loadMoreEnd:
                loadMoreEnd = true;
                adapter.loadMoreComplete();
                break;


        }
    }
}

以上就是利用封装后的BaseAdapter的使用方法  , 如果想了解具体的封装过程可以去上方链接处查看 , 不足之处在于目前baseAdapter没有封装的那么完善 ,只是实现了简单的布局的封装 , 而没有对多条目复杂条目进行封装, 后续有时间将继续更新

以上就是,安卓框架搭建(七)BaseAdapter的封装,的全部内容

如有不了解的 可以去github下载源码 本章节内容为分支7

github源码地址,本章节见dev7分支

或 加入安卓开发交流群:安卓帮595856941

相关链接:

下一篇:

安卓框架搭建(八)路由框架ARouter实现各模块之间通信

猜你喜欢

转载自blog.csdn.net/q9104422999/article/details/81701720