开发手机应用市场-DayOne补充
2016-06-19 16:19
381 查看
完成基本的页面
实现具体功能的frgment对应相应的字符串:
<string-array name="home_titles"> <item>首页</item> <item>应用</item> <item>游戏</item> <item>专题</item> <item>推荐</item> <item>分类</item> <item>排行</item> </string-array>
我们创建相应的fragmnet与之对应,在此之前我们先明确我们的需求:首先我们要从网络访问数据,然后显示相应的视图,那么我们抽象出一个控制器,因为从网络访问有不同的结果,如失败、控、成功,那么我们通过控制器来为不同的状态显示数据,于是创建LoadingPager类:
加载数据的五种:
public static final int STATE_NONE = -1;
public static final int STATE_LOADING = 0;
public static final int STATE_EMPTY = 1;
public static final int STATE_ERROR = 2;
public static final int STATE_SUCCESS = 3;
fragment和loadingPager的关系如图所示:
loadingPager的主要方法:
initCommentView()初始化公共视图,也就是在loadingPager中添加view
private void initCommentView() { mLoadingView = UIUtils.initView(R.layout.pager_loading); this.addView(mLoadingView); mErrorView = UIUtils.initView(R.layout.pager_error); mErrorView.findViewById(R.id.error_btn_retry).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { loadData(); } }); this.addView(mErrorView); mEmptyView = UIUtils.initView(R.layout.pager_empty); this.addView(mEmptyView); refreshView(); }
那么不可能能使显示所有view,于是又利用控制器(就是状态码)来刷新视图的方法refershView,注意三木运算符的使用:
private void refreshView() { mLoadingView.setVisibility((mCurState == STATE_LOADING) || (mCurState == STATE_NONE) ? VISIBLE : GONE); mEmptyView.setVisibility((mCurState == STATE_EMPTY) ? VISIBLE : GONE); mErrorView.setVisibility((mCurState == STATE_ERROR) ? VISIBLE : GONE); if (mSuccessView == null && mCurState == STATE_SUCCESS) { mSuccessView = initSuccessView(); this.addView(mSuccessView); } if (mSuccessView != null) { mSuccessView.setVisibility((mCurState == STATE_SUCCESS) ? VISIBLE : GONE); } }
由上面图片可知假如加载成功那么,loadingPager不显示任何视图,也可以说视图是由fragment来提供的,那么一定还有一个successView的方法来返回成功视图。
再看和loadingPager相对应的各个fragment由于加载数据是每个fragment都是用的,所以抽取出公共baseFragment,在oncreateView中我们应该新建一个loadingPager对象来遮盖住fragment,从而实现控制器的功能,这里注意loadingPager是抽象类,所以要有匿名实现方法,具体如下:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLoadingPager = new LoadingPager(UIUtils.getContext()) { @Override public LoadedResult initData() { return BaseFragment.this.initData(); } @Override public View initSuccessView() { return BaseFragment.this.initSuccessView(); } }; return mLoadingPager; }
这里写出两个和loadingPager同名的方法,注意写法是fragmnet.this.init()主要是便于理解,我们然后在实现每个frgment,完整的fragmnet代码:
public abstract class BaseFragment extends Fragment { private LoadingPager mLoadingPager; public BaseFragment() { // Required empty public constructor } public LoadingPager getLoadingPager() { return mLoadingPager; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mLoadingPager = new LoadingPager(UIUtils.getContext()) { @Override public LoadedResult initData() { return BaseFragment.this.initData(); } @Override public View initSuccessView() { return BaseFragment.this.initSuccessView(); } }; return mLoadingPager; } protected abstract LoadingPager.LoadedResult initData(); public abstract View initSuccessView(); }
利用工厂模式获得fragmnet
我们新建出每个fragment但是假如一个一个new出来很麻烦于是,于是再次用整数的状态码,来创建并且返回不同的fragment,具体代码:public class FragmentFactory { public static final int FRAGMENT_HOME = 0; public static final int FRAGMENT_APP = 1; public static final int FRAGMENT_GAME = 2; b462 public static final int FRAGMENT_SUBJECT = 3; public static final int FRAGMENT_RECOMMEND = 4; public static final int FRAGMENT_CATEGORY = 5; public static final int FRAGMENT_HOT = 6; static SparseArray<BaseFragment> cacheFragment = new SparseArray<BaseFragment>(); public static BaseFragment getFragment(int position) { BaseFragment fragment = null; BaseFragment tmpFragment = cacheFragment.get(position); if (tmpFragment != null) { fragment = tmpFragment; return fragment; } switch (position) { case FRAGMENT_HOME:// 主页 fragment = new HomeFragment(); break; case FRAGMENT_APP:// 应用 fragment = new AppFragment(); break; case FRAGMENT_GAME:// 游戏 fragment = new GameFragment(); break; case FRAGMENT_SUBJECT:// 专题 fragment = new SubjectFragment(); break; case FRAGMENT_RECOMMEND:// 推荐 fragment = new RecommendFragment(); break; case FRAGMENT_CATEGORY:// 分类 fragment = new CategoryFragment(); break; case FRAGMENT_HOT:// 排行 fragment = new HotFragment(); break; default: break; } cacheFragment.put(position, fragment); return fragment; } }
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android wifi 无线调试
- 我是运营,我没有假期
- 基于 Linux 的智能手机 Librem 5 开启预售
- 100 个最佳 Ubuntu 应用(中)
- 在 AppImage、Flathub 和 Snapcraft 平台上搜索 Linux 应用
- 5 个可以满足你的生产力、沟通和娱乐需求的开源手机应用
- 每日安全资讯:哪些属于App违法违规收集使用个人信息?
- 每日安全资讯:命案侦破过程揭示 Google 能够跟踪全世界的手机
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- 24 个必备的 Linux 应用程序
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- 注册表趣味应用小集
- 远程控制技术的应用
- VB实现的《QQ美女找茬游戏》作弊器实例