您的位置:首页 > 理论基础 > 计算机网络

仿知乎日报第十一篇:从网络为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页面继承于这个类,设置各自不同的标题就可以了。

现在直接看代码:

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数据,再解析数据,再把数据设置到相应的控件上面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息