一.我们前面讲了一下,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页面继承于这个类,设置各自不同的标题就可以了。
现在直接看代码:
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数据,再解析数据,再把数据设置到相应的控件上面。