仿知乎日报第十一篇:从网络为12个页面加载数据,并设置数据
2016-09-19 16:59
302 查看
一.我们前面讲了一下,12个页面的只要获得相应的id,就能和http://news-at.zhihu.com/api/4/theme/组合起来获得相应的主题日报的数据,例如日常心理学的id是13,它的url就是http://news-at.zhihu.com/api/4/theme/13;用户推荐日报的id是12,它的url就是http://news-at.zhihu.com/api/4/theme/12。另外12个页面获得的json数据格式是一样的,获得数据解析后放到相应的布局上面,而12个页面的布局也是一样的。所以我们可以创建一个类ThemeDailyBasePage继承于BasePage,把以上所说从网络加载数据的逻辑放在这个类里面,然后12页面继承于这个类,设置各自不同的标题就可以了。
现在直接看代码:
二.跟上一篇一样,代码逻辑也超级简单,只要把逻辑弄清楚了,代码很容易写出来,就算还不熟悉,根据逻辑在代码中看注释就没有问题了
简单说一下,先初始化一些对象,显示需要的控件,隐藏不需要的控件,再从网络拿到json数据,再解析数据,再把数据设置到相应的控件上面。
现在直接看代码:
public class ThemeDailyBasePage extends BasePage { private Gson mGson; private SingleThemeDailyBean mSingleThemeDailyDatas; private BitmapUtils mBitmapUtils; private List<SingleThemeFDailyListDatas> mListViewDatas = newArrayList<SingleThemeDailyBean.SingleThemeFDailyListDatas>(); private MyAdapter mAdapter; private String mThemeDailyNumberString; public ThemeDailyBasePage(MainActivity mainActivity) { super(mainActivity); } @Override protected void initListener() { super.initListener(); lvNews.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // ListView的item一点击,拿到该item所对应的文章url,跟着Intent一起去ArticleActivity if (position != 0) { String url = MyContants.BASEARTICLESTRING + mSingleThemeDailyDatas.stories.get(position-1).id; Intent intent = new Intent(mainActivity, ArticleActivity.class); intent.putExtra("articleUrl", url); mainActivity.startActivity(intent); } } }); } @Override public void initData(String themeDailyNumber) { // 传入12个页面各自的id this.mThemeDailyNumberString = themeDailyNumber; // BitmapUtils初始化,用来异步加载图片 if (mBitmapUtils == null) { mBitmapUtils = new BitmapUtils(mainActivity); } mAdapter = new MyAdapter(); // 为ListView设置Adapter lvNews.setAdapter(mAdapter); // 隐藏轮播图 vpLunboPic.setVisibility(View.GONE); // 显示ImageView ivPic.setVisibility(View.VISIBLE); // 隐藏轮播图下面的点 mFlLunboPoints.setVisibility(View.GONE); // 隐藏今日热文的TextView tvHomeTitle.setVisibility(View.GONE); // 显示放主编图片的容器LinearLayout llEditors.setVisibility(View.VISIBLE); // 加载数据 loadData(); } public void loadData() { // 拼接url String url = MyContants.SINGETHEMEPREFIXURL + mThemeDailyNumberString; HttpUtils httpUtils = new HttpUtils(); // 用HttpUtils类从网络异步加载数据 // 第一个参数:get方式加载 // 第二个参数:url // 第三个参数:RequestCallBack回调,如果访问网络成功则调用onSuccess,失败则调用onFailure httpUtils.send(HttpMethod.GET, url, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { // 拿到json数据 String jsonDataString = responseInfo.result; //System.out.println(jsonDataString); // 解析json数据 parseData(jsonDataString); } @Override public void onFailure(HttpException error, String msg) { // TODO自动生成的方法存根 } }); } public void parseData(String jsonDataString) { // 创建Gson对象,这个对象有一个就可以了,所以判断只有为空才创建 if (mGson == null) { mGson = new Gson(); } // 用Gson解析json数据 mSingleThemeDailyDatas = mGson.fromJson(jsonDataString, SingleThemeDailyBean.class); //System.out.println(mSingleThemeDailyDatas.editors.get(0).bio); // 处理数据 processData(); } private void processData() { // 1.设置大图片 setBigPicture(); // 2.设置标题 setPictureTitle(); // 3.设置主编图片 setEditorsPic(); // 4.设置ListView数据 setListViewData(); } private void setListViewData() { // 设置ListView的数据 mListViewDatas = mSingleThemeDailyDatas.stories; // 通知更新ListView中的数据 mAdapter.notifyDataSetChanged(); } private class MyAdapter extends BaseAdapter { @Override public int getCount() { // TODO自动生成的方法存根 return mListViewDatas.size(); } @Override public Object getItem(int position) { // TODO自动生成的方法存根 return null; } @Override public long getItemId(int position) { // TODO自动生成的方法存根 return 0; } @Override public View getView(int position, View convertView, ViewGroupparent) { ViewHolder viewHolder; if (convertView == null) { // 加载ListView中item的布局 convertView = View.inflate(mainActivity, R.layout.list_item, null); viewHolder = new ViewHolder(); // 拿到ListView的item中的控件TextView viewHolder.textView = (TextView) convertView .findViewById(R.id.tv_list_item_title); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } String listItemTitle = mSingleThemeDailyDatas.stories.get(position).title; // 为控件TextView设置标题数据 viewHolder.textView.setText(listItemTitle); /* * if((mSingleThemeDailyDatas.stories.get(position).images.get(0)) * != null&& *(mSingleThemeDailyDatas.stories.get(position).images.get(0)) != * "") { * * StringlistItemImageUrl = *mSingleThemeDailyDatas.stories.get(position).images.get(0); *mBitmapUtils.display(viewHolder.imageView, listItemImageUrl); } */ return convertView; } } public class ViewHolder { TextView textView; } private void setEditorsPic() { // 移除所有主编的图片 llEditorPics.removeAllViews(); // 遍历,有多少主编头像的图片,就遍历多少次 for (int i = 0; i < mSingleThemeDailyDatas.editors.size(); i++) { // 拿到头像图片 String editorsPicUrl = mSingleThemeDailyDatas.editors.get(i).avatar; // 创建ImageView ImageView imageView = new ImageView(mainActivity); // ImageView的背景在x轴,y轴拉伸后放在ImageView上面 imageView.setScaleType(ScaleType.CENTER); // 拿到LayoutParams对象 LayoutParams layoutParams = new LayoutParams(DensityUtil.dip2px( mainActivity, 40), DensityUtil.dip2px(mainActivity, 480)); // 除了第一个ImageView,后面的ImageView的左边距为10dp if (i != 0) { layoutParams.leftMargin = DensityUtil.dip2px(mainActivity, 10); } // 为ImageView设置LayoutParams imageView.setLayoutParams(layoutParams); // 用BitmapUtils异步加载图片 mBitmapUtils.display(imageView, editorsPicUrl); // 把头像加到LinearLayout容器中 llEditorPics.addView(imageView); } } private void setPictureTitle() { // 拿到标题数据 String pictureTitle = mSingleThemeDailyDatas.description; // 设置标题数据 tvLunboTitle.setText(pictureTitle); } private void setBigPicture() { // 拿到大图片数据 String picUrl = mSingleThemeDailyDatas.image; // System.out.println(picUrl); // 用BitmapUtils异步加载图片 mBitmapUtils.display(ivPic, picUrl); } }
二.跟上一篇一样,代码逻辑也超级简单,只要把逻辑弄清楚了,代码很容易写出来,就算还不熟悉,根据逻辑在代码中看注释就没有问题了
简单说一下,先初始化一些对象,显示需要的控件,隐藏不需要的控件,再从网络拿到json数据,再解析数据,再把数据设置到相应的控件上面。
相关文章推荐
- 仿知乎日报第十篇:从网络加载首页数据,为首页设置数据
- 无缝为Activity、Fragment、任何View设置加载(loading)、重试(retry)和无数据(empty)页面
- jqGrid怎么设置初始化页面时不加载数据(不向服务器请求数据)
- android 重新加载网络页面设置
- iOS - 网络数据加载等待页面的简单实现
- 实现apk下载+跳转WiFi设置页面+xlistview加载数据
- IOS空数据页面,网络加载失败以及重新登陆View的封装(不需要继承)
- 无缝为Activity、Fragment、任何View设置加载(loading)、重试(retry)和无数据(empty)页面。
- 仿知乎日报第九篇:为首页以及其他12个页面从网上加载数据分析
- jqGrid怎么设置初始化页面时不加载数据(不向服务器请求数据)
- Asp.Net 开发之(1) ---如何自动加载数据到页面或更新数据到数据容器中(基础控件)
- JavaScript 在页面加载后自动设置焦点
- 因没有设置文件夹权限导致的发布的页面不能在文本中写人数据
- 怎么在页面还没有加载完成时候,在页面上显示一个:"数据加载中......"
- jsf页面参数的传递及加载数据
- 如何为复杂页面实现过渡页面 [数据加载中]【陈希章】
- jQuery动态加载页面和请求所返回的数据
- javascript实现页面加载,预读取完数据后再显示页面
- JSF页面间参数的传递及加载初始化数据
- Delphi完成网络页面表单数据地自动提交