public abstract class BaseActivity extends AppCompatActivity {
   //存储全部activity
    private static List<Activity> 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);
    }
}
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();
            }
        });
    }
}
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);
    }
}
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();
            PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
            if (!pm.isIgnoringBatteryOptimizations(packageName)) {
                Intent intent = new Intent();
                intent.setAction(android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
                intent.setData(Uri.parse("package:" + packageName));
                startActivity(intent);
            }
        }
    }
    @Override
    protected void loadData() {
        List<Fragment> 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);
            }
        }
    }
}
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 Bundle 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();
}
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);
    }
}
public abstract class BannerFragment extends RecyclerViewFragment implements OnItemClickListener {
    private static final long LOOP_TIME = 5000;
//此轮播使用的是第三方的控件,实际项目开发时为了方便而使用的一个库。
    @BindView(R.id.banner)
    ConvenientBanner<String> convenientBanner;
    protected abstract List<String> getBitmapList();
    protected void loadConvenientBanner() {
        convenientBanner.setPages(new CBViewHolderCreator<LocalImageHolderView>() {
            @Override
            public LocalImageHolderView createHolder() {
                return new LocalImageHolderView();
            }
        }, getBitmapList())
                .setPageIndicator(new int[]{R.drawable.page_indicator, R.drawable.page_indicator_focused})
                .setOnItemClickListener(this);
        convenientBanner.startTurning(LOOP_TIME);
    }
    @Override
    protected void initView() {
        super.initView();
        convenientBanner.setPages(new CBViewHolderCreator<LocalImageHolderView>() {
            @Override
            public LocalImageHolderView createHolder() {
                return new LocalImageHolderView();
            }
        }, getBitmapList())
                .setPageIndicator(new int[]{R.drawable.page_indicator, R.drawable.page_indicator_focused})
                .setOnItemClickListener(this);
        convenientBanner.startTurning(LOOP_TIME);
    }
    @Override
    protected void loadData(){
        super.loadData();
    }
    public class LocalImageHolderView implements Holder<String> {
        private ImageView imageView;
        @Override
        public View createView(Context context) {
            imageView = new ImageView(context);
            imageView.setScaleType(ImageView.ScaleType.FIT_XY);
            return imageView;
        }
        @Override
        public void UpdateUI(Context context, final int position, String data) {
            Glide.with(context).load(data).into(imageView);
        }
    }
}
Android-多列表的项目(Rxjava+Rtrofit+Recyclerview+Glide+Adapter封装)之(一)项目架构
原文:http://blog.csdn.net/jack__frost/article/details/55853599