码云地址:https://gitee.com/tjbaobao/TJFramework
Github地址:https://github.com/TJHello/TJFramework
QQ群交流:425219113(计算机语言交流)
一、TJFramework的定位
TJFramework会尝试重新定义Android的编程流程,让其更倾向于面向实际的业务和对象。例如Activity的编程,很多人觉得Activity就是从onCreate方法开始的,然后在里面获取intent传过来的数据,设置布局,加载数据,然后初始化布局。但我的定义是我们不需要知道什么onCreate方法,我们只需要知道 初始化数据-设置布局-加载数据-初始化布局 就行了,也就是我的onInitValues(),onInitView(),onLoadData(),或者你们会说:“我平时也会在onCreate里面分出这几个方法,你这不是和我们的有什么区别?”,这只能证明我的思路是对的,我为你做了你想做的。
这就是TJFramework的理念,TJFramework尝试去简化一切不需要的东西,而替换成直观的有直接作用的。所以,使用TJFramework你不需要去多想什么,只需要去使用,你就能直接得到你所想要的。例如,RecycleView,设置点击事件,你得到的不再是一个position,而是一个Info,还有对应的Holder,不仅如此,我会在内部处理好各种奇葩崩溃,和提供更多更快捷的接口,这不正是你想要的吗?
二、项目进度
当前项目的最新版本是1.0.037,经过了这几十个版本的开发,已经是相当的稳定了,但里面的功能并不多,也还有很多连我都看不过眼的地方,所以这个框架有很大的完善空间,这是毋庸置疑的,只是我觉得我这样闭门造车已经不能给这个框架带来更多的实质性的完善了。这也是我现在需要将TJFramework拿出来面向大众的原因,我希望在大家使用的过程中,让TJFramework不断的完善,也是给我自己一些动力。
三、TJFramework一览
![]() | ![]() | ![]() |
---|---|---|
示例程序还在不断完善中 | 一套基于TJFramework的高级列表的解决方案 | 一套基于TJFramework的自定义弹窗的解决方案 |
这里我列出一些框架的使用场景,如果你觉得代码风格还合适,就请继续吧。
public class TJActivityExampleActivity extends AppActivity {
//使用BaseRecyclerView之前需要先创建对应的Adapter,而创建Adapter就需要创建Holder和Info实体
private List<TJActivityExampleInfo> infoList = new ArrayList<>();
private TJActivityExampleAdapter adapter = new TJActivityExampleAdapter(infoList,R.layout.tj_activity_example_activity_item_layout);
//其实用了Kotlin之后就不需要findViewById或者butterknife这类的框架了,但我觉得kotlin写出来的代码不够美观,不适合用来做示例
@BindView(R.id.recyclerView)
BaseRecyclerView<TJActivityExampleAdapter.Holder,TJActivityExampleInfo> recyclerView;
private String title ;
@Override
protected void onInitValues(@Nullable Bundle savedInstanceState) {
super.onInitValues(savedInstanceState);
title = this.getIntent().getStringExtra("title");
}
@Override
protected void onInitView() {
setContentView(R.layout.tj_activity_example_actyivity_layout);
ButterKnife.bind(this);
recyclerView.toGridView(2);
//recyclerView.toListView();//普通列表
//recyclerView.toStaggeredGridView();//瀑布列表
recyclerView.addGridAverageCenterDecoration(Tools.dpToPx(8),Tools.dpToPx(8));//添加默认间隔
//recyclerView.addItemDecoration(BaseItemDecoration.getLineVerticalDecoration(Tools.dpToPx(8)));//添加自定义间隔
recyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new OnItemClickListener());
}
@Override
protected void onLoadData() {
infoList.clear();
for(int i=0;i<10;i++)
{
TJActivityExampleInfo info = new TJActivityExampleInfo();
info.imageUrl = "https://tjbaobao.oss-cn-shenzhen.aliyuncs.com/TJFramework/lakes-04_m_2.jpg?Expires=1536823171&OSSAccessKeyId=TMP.AQEJyBSvPTdZZJdpbTQXAncNMU0MZFrZ96Kwe5jh_0C0jGUsfsorsvlZ4-OlADAtAhUAhkMvYYd0k9fR-XZiRgn9vm6WHgMCFChRU65jf05kgM1TVRB9tZcqKG3V&Signature=H%2BkeUyFJj8rEOrFiYWqlDdgKekI%3D";
infoList.add(info);
}
adapter.notifyDataSetChanged();
}
//需要在布局中使用BaseTitleBar并且添加android:id="@+id/titleBar",当且仅当这个id存在的时候才会调用这个方法
@Override
protected void onInitTitleBar(@NonNull BaseTitleBar titleBar) {
titleBar.addImageToLeft(R.drawable.fw_ic_back);
titleBar.setTitle(title);
}
@Override
public <V extends TitleBarInfo.BaseView> void onTitleBarClick(int layoutType, int position, V info) {
if(layoutType==BaseTitleBar.LAYOUT_LEFT&&position==0)
{
finish();
}
}
//列表Item点击监听器
private class OnItemClickListener implements BaseRecyclerAdapter.OnItemClickListener<TJActivityExampleAdapter.Holder,TJActivityExampleInfo>
{
@Override
public void onItemClick(@NonNull TJActivityExampleAdapter.Holder holder, @NonNull TJActivityExampleInfo info, int position) {
Tools.showToast("点击了:"+position);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
adapter.destroy();
}
}
public class TJActivityExampleAdapter extends BaseRecyclerAdapter<TJActivityExampleAdapter.Holder,TJActivityExampleInfo> {
//使用了ImageDownloader之后,你会发现其已经具备了缓存、列表滑动防止错位、裁剪压缩、防止重复下载等等功能。
private ImageDownloader imageDownloader = ImageDownloader.getInstance();
public TJActivityExampleAdapter(List<TJActivityExampleInfo> tjActivityExampleInfos, int itemLayoutRes) {
super(tjActivityExampleInfos, itemLayoutRes);
imageDownloader.setDefaultImgSize(DeviceUtil.getScreenWidth()/2,DeviceUtil.getScreenWidth()/2);
}
@Override
public void onBindViewHolder(@NonNull Holder holder, @NonNull TJActivityExampleInfo info, int position) {
imageDownloader.load(info.imageUrl,holder.ivImage);
}
@Override
public Holder onGetHolder(View view, int type) {
return new Holder(view);
}
public class Holder extends BaseRecyclerView.BaseViewHolder{
@BindView(R.id.ivImage)
ImageView ivImage ;
Holder(View itemView) {
super(itemView);
}
@Override
public void onInitView(View itemView) {
ButterKnife.bind(this,itemView);
}
}
public void destroy()
{
imageDownloader.stop();
}
}
四、框架接入
-
Step 1. 添加Jitpack仓库到你的项目build.gradle
allprojects { repositories { ... maven { url 'https://jitpack.io' } } }
-
Step 2. 添加远程库到app-build.gradle
dependencies { api 'com.github.TJHello:TJFramework:1.0.036' }
-
Step 3. app-build.gradle配置支持JAVA8
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
-
框架配置
1. Application配置
//在AndroidManifest-Application中增加 android:name="com.tjbaobao.framework.base.BaseApplication" //如果已经有了别的Application基类,请在Application-onCreate中增加以下代码 com.tjbaobao.framework.base.BaseApplication.init(this);
2. 数据库配置
//在AndroidManifest-Application中增加 <meta-data android:name="database_name" android:value="TjFramework" /> <meta-data android:name="database_version" android:value="1"/> <meta-data android:name="FW_IS_DEBUG" android:value="true" />