Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构.doc_第1页
Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构.doc_第2页
Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构.doc_第3页
Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构.doc_第4页
Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构项目介绍:1.这是一个简易使用的网络请求封装项目,可快速移植实现安卓网络层的开发;2.这是一个常见的app模板,使用较好的app架构,并实现一系列的优化。先上几张图看看如例子的两个页面可以看到就是想这样的样式,以及请求,我们在android应用开发中经常遇到。好了,废话不多说,下面开始正文。文章结构:(1)整个应用的架构模式;(2)Activity和Fragment的封装;一、 整个应用的架构模式:M层就是我的bean包了,C层则由activity来担当,V层则由自定义view以及xml文件来担当。contronller(控制器)是一个中间桥梁的作用,通过接口通信来协同 View(视图)和Model(模型)工作,起到了两者之间的通信作用。二、 Activity和Fragment的封装:可以看到,我封装了三层抽象activity,各自负责不同的业务。这个是很常见的app的activity封装。1.BaseActivity是app设计中的最高父类,则由它处理一些加载的优化,以及使用了模板模式,制定一系列的抽象方法,管理相关的app整体功能(如退出整个app)。public abstract class BaseActivity extends AppCompatActivity /存储全部activity private static List activities = new ArrayList(); Override protected void onCreate(Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); Logger.i(Activity- + getClass().getSimpleName(); addActivity(this); if (getLayoutId() != 0) setContentView(getLayoutId(); else throw new IllegalArgumentException(返回一个正确的ContentView); ButterKnife.bind(this);/ButterKnife必须在这里bing,也就是初始化,那么其余activity就不用顾及这个了 initView();/模板模式 initEvent(); loadData(); protected abstract int getLayoutId(); protected abstract void initView(); protected abstract void initEvent(); protected abstract void loadData(); Override protected void onPause() super.onPause(); removeActivity(this);/释放所有资源 / 添加Activity到容器中 private void addActivity(Activity activity) if (activity != null & !activities.contains(activity) activities.add(activity); private void removeActivity(Activity activity) if (activity != null & activities.contains(activity) activities.remove(activity); / 退出整个APP public static void exit() if (activities != null & activities.size() 0) for (Activity activity : activities) activity.finish(); System.exit(0); 2.ToolbarActivity是每个activity需要标题栏封装;主要是为了节省代码,并使得继承此activity的activity得以逻辑更加清晰。public abstract class ToolbarActivity extends BaseActivity BindView(R.id.toolbar) Toolbar toolbar; BindView(R.id.title) public TextView title; Override protected void onCreate(Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); toolbar.setTitle();/节省代码啦,以后app的activity不用再为标题烦恼 setSupportActionBar(toolbar); if (getSupportActionBar() != null) getSupportActionBar().setDisplayHomeAsUpEnabled(true);/决定左上角的图标是否可以点击 toolbar.setNavigationOnClickListener(new View.OnClickListener() Override public void onClick(View v) finish(); ); 3.DrawerActivity是抽屉activity;这样写的话,让MainActivity去继承就会使main的代码更加简洁,并且可以复用代码public abstract class DrawerActivity extends ToolbarActivity implements NavigationView.OnNavigationItemSelectedListener BindView(R.id.navigation_view) NavigationView navigationView; BindView(R.id.drawer_layout) DrawerLayout drawerLayout; Override protected void onCreate(Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(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);/设置那个抽屉图片,主要看美工了,美工要规定那个图片大小,我这里是随便放的 toolbar.setNavigationOnClickListener(new View.OnClickListener() Override public void onClick(View v) drawerLayout.openDrawer(Gravity.LEFT); ); navigationView.setNavigationItemSelectedListener(this); Override public boolean onNavigationItemSelected(MenuItem item) switch (item.getItemId() case R.id.publish: /跳转的activity在这里建立/ startActivity(new Intent(this, PublishActivity.class); drawerLayout.closeDrawers(); return true; case R.id.published:/ startActivity(new Intent(this, PublishedActivity.class); drawerLayout.closeDrawers(); return true; case R.id.growth:/ startActivity(new Intent(this, GrowthActivity.class); drawerLayout.closeDrawers(); break; case R.id.collect:/ startActivity(new Intent(this, CollectionActivity.class); drawerLayout.closeDrawers(); return true; case R.id.setting:/ startActivity(new Intent(this, SettingActivity.class); drawerLayout.closeDrawers(); return true; return super.onContextItemSelected(item); 所以继承DrawerActivity的MainActivity的代码就十分的简洁了,而且其他的activity也可以继承ToolbarActivity从而实现复用了。public class MainActivity extends DrawerActivity private static final int PAGE_LIMIT = 4;/这里是限定预加载的页面个数,不用Fragment重新去onCreate。使用这个就是去优化页面,从而viewpager去缓存view BindView(R.id.tab_layout) TabLayout tabLayout; BindView(R.id.viewpager) NoScrollViewPager viewPager; Override protected int getLayoutId() return R.layout.activity_main; Override protected void initView() Override protected void initEvent() if (Build.VERSION.SDK_INT = Build.VERSION_CODES.M) String packageName = getPackageName(); PowerManagerpm=(PowerManager) getSystemService(Context.POWER_SERVICE); if (!pm.isIgnoringBatteryOptimizations(packageName) Intent intent = w Intent(); intent.setAction(vider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS); intent.setData(Uri.parse(package: + packageName); startActivity(intent); Override protected void loadData() List fragments = new ArrayList(); fragments.add(new AbilityFragment(); fragments.add(new AttentionFragment(); fragments.add(new DiscoveryFragment(); fragments.add(new ArenaFragment(); ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager(), fragments); viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(PAGE_LIMIT); tabLayout.setupWithViewPager(viewPager); for (int i = 0; i tabLayout.getTabCount(); i+) TabLayout.Tab tab = tabLayout.getTabAt(i); Drawable drawable = null; switch (i) case 0: drawable = ContextCompat.getDrawable(this, R.drawable.tab_item_home); break; case 1: drawable = ContextCompat.getDrawable(this, R.drawable.tab_item_attention); break; case 2: drawable = ContextCompat.getDrawable(this, R.drawable.tab_item_discovery); break; case 3: drawable = ContextCompat.getDrawable(this, R.drawable.tab_item_arena); break; if (tab != null) tab.setIcon(drawable); 同样的,我们可以看到我写了三个抽象fragment,分别负责不同的业务。1.BaseFragment。主要有模板模式的方法,fragment的懒加载解析懒加载: setUserVisibleHint方法用于告诉系统,这个Fragment的UI是否是可见的。所以我们只需要继承Fragment并重写该方法,即可实现在fragment可见时才进行数据加载操作,即Fragment的懒加载。public abstract class BaseFragment extends Fragment private Handler handler = new Handler(); private Runnable loadDataTask = new Runnable() Override public void run() loadData(); ; Nullable Override public View onCreateView(LayoutInflater inflater, Nullable ViewGroup container, Nullable Bndle savedInstanceState) View view = inflater.inflate(getLayoutId(), container, false); ButterKnife.bind(this, view); return view; Override public void onViewCreated(View view, Nullable Bundle savedInstanceState) initView(); initEvent(); / 延迟加载数据,减少卡顿 handler.postDelayed(loadDataTask, 500); Override public void setUserVisibleHint(boolean isVisibleToUser) super.setUserVisibleHint(isVisibleToUser); /做了个判断,判断isVisibleToUser只有为true,才去执行loadData()方法加载网络(或本地)数据。 if (!isVisibleToUser) handler.removeCallbacks(loadDataTask); protected abstract void initView(); protected abstract void initEvent(); protected abstract void loadData(); protected abstract int getLayoutId();2.RecyclerViewFragment,因为RecyclerView在多列表app中占很多部分,所以我抽离它作为一层fragment来编写,方便代码复用。还有此fragment还要完成下拉刷新的消息通知,子类实现复用。public abstract class RecyclerViewFragment extends BaseFragment implements SwipeRefreshLayout.OnRefreshListener protected static final int REFRESH = 0x101; BindView(R.id.recycler_view) RecyclerView recyclerView; BindView(R.id.swipeRefreshLayout) SwipeRefreshLayout swipeRefreshLayout; protected RecyclerView.Adapter adapter;/一个handle让子类覆写onrefresh去通知父类,然后父类调用handler实现复用。 private Handler handler = new Handler() Override public void handleMessage(Message msg) switch (msg.what) case REFRESH: swipeRefreshLayout.setRefreshing(false); break; ; Override protected void initView() FullyLinearLayoutManager layoutManager = new FullyLinearLayoutManager(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); Override protected void initEvent() swipeRefreshLayout.setOnRefreshListener(this); Override protected void loadData() adapterBuilder(); recyclerView.setAdapter(adapter); /子activity设置适配器 protected abstract void adapterBuilder(); Override public void onRefresh() /todo 网络请求任务 handler.sendEmptyMessageDelayed(REFRESH, 3000); 3.BannerFragment主要完成轮播图的封装,考虑广告众多app提供了一层。public abstract class BannerFragment extends RecyclerViewFragment implements OnItemClickListener private static final long LOOP_TIME = 5000;/此轮播使用的是第三方的控件,实际项目开发时为了方便而使用的一个库。 BindView(R.id.banner) ConvenientBanner convenientBanner; protected abstract List getBitmapList(); protected oid loadConvenientBanner() convenientBanner.setPages(new CBViewHolderCreator() Override public LocalImageHolderView createHolde

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论