Android多列表的项目Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装之一项目架构Word文档下载推荐.docx
《Android多列表的项目Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装之一项目架构Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android多列表的项目Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装之一项目架构Word文档下载推荐.docx(16页珍藏版)》请在冰点文库上搜索。
();
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
super.onCreate(savedInstanceState);
Logger.i("
Activity--->
"
+getClass().getSimpleName());
addActivity(this);
if(getLayoutId()!
=0){
setContentView(getLayoutId());
}else{
thrownewIllegalArgumentException("
返回一个正确的ContentView"
);
}
ButterKnife.bind(this);
//ButterKnife必须在这里bing,也就是初始化,那么其余activity就不用顾及这个了
initView();
//模板模式
initEvent();
loadData();
protectedabstractintgetLayoutId();
protectedabstractvoidinitView();
protectedabstractvoidinitEvent();
protectedabstractvoidloadData();
protectedvoidonPause(){
super.onPause();
removeActivity(this);
//释放所有资源
//添加Activity到容器中
privatevoidaddActivity(Activityactivity){
if(activity!
=null&
&
!
activities.contains(activity)){
activities.add(activity);
privatevoidremoveActivity(Activityactivity){
activities.contains(activity)){
activities.remove(activity);
//退出整个APP
publicstaticvoidexit(){
if(activities!
activities.size()>
0){
for(Activityactivity:
activities){
activity.finish();
System.exit(0);
}
2.ToolbarActivity是每个activity需要标题栏封装;
主要是为了节省代码,并使得继承此activity的activity得以逻辑更加清晰。
publicabstractclassToolbarActivityextendsBaseActivity{
@BindView(R.id.toolbar)
Toolbartoolbar;
@BindView(R.id.title)
publicTextViewtitle;
toolbar.setTitle("
//节省代码啦,以后app的activity不用再为标题烦恼
setSupportActionBar(toolbar);
if(getSupportActionBar()!
=null){
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
//决定左上角的图标是否可以点击
toolbar.setNavigationOnClickListener(newView.OnClickListener(){
publicvoidonClick(Viewv){
finish();
});
3.DrawerActivity是抽屉activity;
这样写的话,让MainActivity去继承就会使main的代码更加简洁,并且可以复用代码
publicabstractclassDrawerActivityextendsToolbarActivityimplementsNavigationView.OnNavigationItemSelectedListener{
@BindView(R.id.navigation_view)
NavigationViewnavigationView;
@BindView(R.id.drawer_layout)
DrawerLayoutdrawerLayout;
ActionBarDrawerToggledrawerToggle=newActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.drawer_open,R.string.drawer_close);
drawerToggle.syncState();
//该方法会自动和actionBar关联,将开关的图片显示在了action上,如果不设置,也可以有抽屉的效果,不过是默认的图标
drawerLayout.setDrawerListener(drawerToggle);
drawerToggle.setDrawerIndicatorEnabled(false);
toolbar.setNavigationIcon(R.drawable.toolbar_navigation);
//设置那个抽屉图片,主要看美工了,美工要规定那个图片大小,我这里是随便放的
drawerLayout.openDrawer(Gravity.LEFT);
navigationView.setNavigationItemSelectedListener(this);
publicbooleanonNavigationItemSelected(MenuItemitem){
switch(item.getItemId()){
caseR.id.publish:
//跳转的activity在这里建立
//startActivity(newIntent(this,PublishActivity.class));
drawerLayout.closeDrawers();
returntrue;
caseR.id.published:
//startActivity(newIntent(this,PublishedActivity.class));
caseR.id.growth:
//startActivity(newIntent(this,GrowthActivity.class));
break;
caseR.id.collect:
//startActivity(newIntent(this,CollectionActivity.class));
caseR.id.setting:
//startActivity(newIntent(this,SettingActivity.class));
returnsuper.onContextItemSelected(item);
所以继承DrawerActivity的MainActivity的代码就十分的简洁了,而且其他的activity也可以继承ToolbarActivity从而实现复用了。
publicclassMainActivityextendsDrawerActivity{
privatestaticfinalintPAGE_LIMIT=4;
//这里是限定预加载的页面个数,不用Fragment重新去onCreate。
使用这个就是去优化页面,从而viewpager去缓存view
@BindView(R.id.tab_layout)
TabLayouttabLayout;
@BindView(R.id.viewpager)
NoScrollViewPagerviewPager;
protectedintgetLayoutId(){
returnR.layout.activity_main;
protectedvoidinitView(){
protectedvoidinitEvent(){
if(Build.VERSION.SDK_INT>
=Build.VERSION_CODES.M){
StringpackageName=getPackageName();
PowerManagerpm=(PowerManager)getSystemService(Context.POWER_SERVICE);
if(!
pm.isIgnoringBatteryOptimizations(packageName)){
Intentintent=wIntent();
intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("
package:
+packageName));
startActivity(intent);
protectedvoidloadData(){
List<
Fragment>
fragments=newArrayList<
fragments.add(newAbilityFragment());
fragments.add(newAttentionFragment());
fragments.add(newDiscoveryFragment());
fragments.add(newArenaFragment());
ViewPagerAdapteradapter=newViewPagerAdapter(getSupportFragmentManager(),fragments);
viewPager.setAdapter(adapter);
viewPager.setOffscreenPageLimit(PAGE_LIMIT);
tabLayout.setupWithViewPager(viewPager);
for(inti=0;
i<
tabLayout.getTabCount();
i++){
TabLayout.Tabtab=tabLayout.getTabAt(i);
Drawabledrawable=null;
switch(i){
case0:
drawable=ContextCompat.getDrawable(this,R.drawable.tab_item_home);
case1:
drawable=ContextCompat.getDrawable(this,R.drawable.tab_item_attention);
case2:
drawable=ContextCompat.getDrawable(this,R.drawable.tab_item_discovery);
case3:
drawable=ContextCompat.getDrawable(this,R.drawable.tab_item_arena);
if(tab!
tab.setIcon(drawable);
同样的,我们可以看到我写了三个抽象fragment,分别负责不同的业务。
1.BaseFragment。
主要有模板模式的方法,fragment的懒加载
解析懒加载:
setUserVisibleHint方法用于告诉系统,这个Fragment的UI是否是可见的。
所以我们只需要继承Fragment并重写该方法,即可实现在fragment可见时才进行数据加载操作,即Fragment的懒加载。
publicabstractclassBaseFragmentextendsFragment{
privateHandlerhandler=newHandler();
privateRunnableloadDataTask=newRunnable(){
publicvoidrun(){
};
@Nullable
publicViewonCreateView(LayoutInflaterinflater,@NullableViewGroupcontainer,@NullableBndlesavedInstanceState){
Viewview=inflater.inflate(getLayoutId(),container,false);
ButterKnife.bind(this,view);
returnview;
publicvoidonViewCreated(Viewview,@NullableBundlesavedInstanceState){
//延迟加载数据,减少卡顿
handler.postDelayed(loadDataTask,500);
publicvoidsetUserVisibleHint(booleanisVisibleToUser){
super.setUserVisibleHint(isVisibleToUser);
//做了个判断,判断isVisibleToUser只有为true,才去执行loadData()方法加载网络(或本地)数据。
isVisibleToUser){
handler.removeCallbacks(loadDataTask);
2.RecyclerViewFragment,因为RecyclerView在多列表app中占很多部分,所以我抽离它作为一层fragment来编写,方便代码复用。
还有此fragment还要完成下拉刷新的消息通知,子类实现复用。
publicabstractclassRecyclerViewFragmentextendsBaseFragmentimplementsSwipeRefreshLayout.OnRefreshListener{
protectedstaticfinalintREFRESH=0x101;
@BindView(R.id.recycler_view)
RecyclerViewrecyclerView;
@BindView(R.id.swipeRefreshLayout)
SwipeRefreshLayoutswipeRefreshLayout;
protectedRecyclerView.Adapteradapter;
//一个handle让子类覆写onrefresh去通知父类,然后父类调用handler实现复用。
privateHandlerhandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseREFRESH:
swipeRefreshLayout.setRefreshing(false);
FullyLinearLayoutManagerlayoutManager=newFullyLinearLayoutManager(getActivity(),LinearLayout.VERTICAL,false);
layoutManager.setSmoothScrollbarEnabled(true);
recyclerView.setLayoutManager(layoutManager);
recyclerView.setNestedScrollingEnabled(false);
swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE);
swipeRefreshLayout.setColorSchemeResources(R.color.colorArenaGreen,R.color.colorAccent,R.color.colorMainDividerLine);
swipeRefreshLayout.setOnRefreshListener(this);
protectedvoidloadData(){
adapterBuilder();
recyclerView.setAdapter(adapter);
//子activity设置适配器
protectedabstractvoidadapterBuilder();
publicvoidonRefresh(){
//todo网络请求任务
handler.sendEmptyMessageDelayed(REFRESH,3000);
3.BannerFragment主要完成轮播图的封装,考虑广告众多app提供了一层。
publicabstractclassBannerFragmentextendsRecyclerViewFragmentimplementsOnItemClickListener{
privatestaticfinallongLOOP_TIME=5000;
//此轮播使用的是第三方的控件,实际项目开发时为了方便而使用的一个库。
@BindView(R.id.banner)
ConvenientBanner<
String>
convenientBanner;
protectedabstractList<
getBitmapList();
protectedoidloadConvenientBanner(){
convenientBanner.setPages(newCBViewHolderCreator<
LocalImageHolderView>
(){
publicLocalImageHolderViewcre