在框架中 直接引用写好的 开源库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的使用方法 , 如果想了解具体的封装过程可以 移至 RecyclerView的BaseAdapter的封装 中有具体的详细介绍, 不足之处在于目前baseAdapter没有封装的那么完善 ,只是实现了简单的布局的封装 , 而没有对多条目复杂条目进行封装, 后续有时间将继续更新
以上就是,安卓框架搭建(七)BaseAdapter的封装,的全部内容
如有不了解的 可以去github下载源码 本章节内容为分支7