一.这一篇我们要从网络为首页加载数据,解析数据,并为各个组件设置数据。我们先来看看HomePage的代码,逻辑后面分析。代码看起虽然挺多的,逻辑却没有几步。
public class HomeBasePage extends BasePage { private Gson mGson; private HomeDataBean mHomeData; private List<HomeLunboData> mLunboDatas = new ArrayList<HomeDataBean.HomeLunboData>(); private List<HomeListViewData> mListViewDatas = newArrayList<HomeDataBean.HomeListViewData>(); private LunboAdapter mLunboAdapter; private int selectedPosition; private ListViewAdapter mListViewAdapter; private BitmapUtils mBitmapUtils; public HomeBasePage(MainActivity mainActivity) { super(mainActivity); // TODO自动生成的构造函数存根 } @Override public void initData(String themeDailyNumber) { // BitmapUtils类专门用来异步从网络加载图片 if (mBitmapUtils == null) { mBitmapUtils = new BitmapUtils(mainActivity); mBitmapUtils.configDefaultBitmapConfig(Config.ARGB_4444); } // 首页显示设置按钮 ibSetting.setVisibility(View.VISIBLE); // 设置首页标题 tvTitle.setText("首页"); // 从网络中加载数据 loadData(); } @Override protected void initListener() { vpLunboPic.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { // 轮播图一切换,拿到该页面的position,传给成员变量selectedPosition selectedPosition = position; // 为轮播图设置标题并把该页面对应的点从灰色变成白色 setTextAndSelectPoint(); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO自动生成的方法存根 } @Override public void onPageScrollStateChanged(int arg0) { // TODO自动生成的方法存根 } }); // ListView的item一点击,带着该item的文章id去ArticleActivity lvNews.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 因为ListView有个头布局,而头布局的position为0,头布局不是文章item,所以position != 0 if (position != 0) { String url = MyContants.BASEARTICLESTRING + mHomeData.stories.get(position-1).id; Intent intent = new Intent(mainActivity,ArticleActivity.class); intent.putExtra("articleUrl", url); mainActivity.startActivity(intent); } } }); super.initListener(); } private void loadData() { mLunboAdapter = new LunboAdapter(); // 为轮播图的ViewPager设置Adapter vpLunboPic.setAdapter(mLunboAdapter); mListViewAdapter = new ListViewAdapter(); // 为ListView设置Adapter lvNews.setAdapter(mListViewAdapter); // 先从SharedPreference里面拿json数据 String jsonCache = SpTools.getString(mainActivity, MyContants.HOMELATEST, ""); // 如果数据存在,直接去解析Json数据 if (!TextUtils.isEmpty(jsonCache)) { // System.out.println(jsonCache); parseData(jsonCache); } HttpUtils httpUtils = new HttpUtils(); // 用HttpUtils异步从网络获取数据 // 第一个参数:get方式获取数据 // 第二个参数:url地址 // 第三个参数:回调对象,获取数据成功或获取数据失败后调用 httpUtils.send(HttpMethod.GET, MyContants.HOMELATEST, new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { // 获取数据成功后,拿到json数据 String homeJsonData = responseInfo.result; // 这里做一个缓存,把json数据保存到SharedPreference里面 SpTools.putString(mainActivity,MyContants.HOMELATEST, homeJsonData); // System.out.println("Data" +homeJsonData); if (!TextUtils.isEmpty(homeJsonData) ) { parseData(homeJsonData); } } @Override public void onFailure(HttpException error, String msg) { // TODO自动生成的方法存根 } }); } private void parseData(String homeJsonData) { // 创建Gson对象,这个对象只要有一个就可以了,所以只有为空的时候才创建 if (mGson == null) { mGson = new Gson(); } // 用Gson解析数据 mHomeData = mGson.fromJson(homeJsonData, HomeDataBean.class); //System.out.println(mHomeData.stories.get(0).images.get(0)); // 处理数据 processData(); } private void processData() { // 1.给ViewPager数据 setLunboData(); // 2.初始化点 initLunboPoints(); // 3.设置标题及点的选中 setTextAndSelectPoint(); // 4.为ListView设置数据 setListViewData(); } private void setListViewData() { // 为ListView设置数据 mListViewDatas = mHomeData.stories; } private class ListViewAdapter extends BaseAdapter { @Override public int getCount() { return mListViewDatas.size(); } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { 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(); // 拿到item里面的各个组件 viewHolder.textView = (TextView) convertView .findViewById(R.id.tv_list_item_title); viewHolder.imageView = (ImageView) convertView .findViewById(R.id.iv_list_item_image); convertView.setTag(viewHolder); } else { viewHolder = (ViewHolder) convertView.getTag(); } // 为item里面的TextView组件设置标题 viewHolder.textView.setText(mListViewDatas.get(position).title); // 为item里面的ImageView组件设置图片,还是用BitmapUtils异步加载 String listImageUrl = mListViewDatas.get(position).images.get(0); if (!TextUtils.isEmpty(listImageUrl)) { mBitmapUtils.display(viewHolder.imageView, listImageUrl); } else { viewHolder.imageView.setVisibility(View.GONE); } return convertView; } } private class ViewHolder { TextView textView; ImageView imageView; } private voidsetTextAndSelectPoint() { // 设置轮播图的标题 tvLunboTitle.setText(mHomeData.top_stories.get(selectedPosition).title); // 遍历,轮播图的setOnPageChangeListener的onPageChange方法中拿到了当前的页面的position, // 并把它传给selectedPosition,如果i为selectedPosition,则把点设为白点 for (int i = 0; i < mLunboDatas.size(); i++) { llLunboPoints.getChildAt(i).setEnabled(i == selectedPosition); } } private void initLunboPoints() { // 先移除轮播图下面所有的点 llLunboPoints.removeAllViews(); // 遍历轮播图的数量,即有多少轮播图,就创建几个点 for (int i = 0; i < mLunboDatas.size(); i++) { View view = new View(mainActivity); // 为View设置背景,背景为一个选择器,state_enabled为true的时候为白点,为false的时候为灰点 view.setBackgroundResource(R.drawable.selector_lunbo_points); // 默认都设为灰色点 view.setEnabled(false); // 为点View创建LayoutParams,里面传入的参数是px // 所以我们创建了一个工具类DensityUtil的dip2px()方法将density单位转为像素单位px LayoutParams layoutParams = new LayoutParams(DensityUtil.dip2px( mainActivity, 5), DensityUtil.dip2px(mainActivity, 5)); // 为点View设置左边边距 layoutParams.leftMargin = DensityUtil.dip2px(mainActivity, 5); // 为点View设置LayoutParams view.setLayoutParams(layoutParams); // 把点加进LinearLayout llLunboPoints.addView(view); } } private class LunboAdapter extends PagerAdapter { @Override public int getCount() { return mLunboDatas.size(); } @Override public boolean isViewFromObject(View arg0, Object arg1) { // TODO自动生成的方法存根 return arg0 == arg1; } @Override public void destroyItem(ViewGroup container, int position, Objectobject) { container.removeView((View) object); } @Override public Object instantiateItem(ViewGroup container, int position) { // 轮播图的每一页页面都是一个ImageView ImageView imageView = new ImageView(mainActivity); // ImageView上面的图片x轴,y轴上都拉伸 imageView.setScaleType(ScaleType.FIT_XY); // 用BitmapUtills从网上异步加载图片,并放在ImageView容器中 // 第一个参数为容器 // 第二个参数为url mBitmapUtils.display(imageView, mHomeData.top_stories.get(position).image); // 轮播图的ImageView一点击,带着该轮播图页面的文章id去ArticleActivity imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String url = MyContants.BASEARTICLESTRING + mHomeData.top_stories.get(vpLunboPic.getCurrentItem()).id; Intent intent = new Intent(mainActivity,ArticleActivity.class); intent.putExtra("articleUrl", url); mainActivity.startActivity(intent); } }); container.addView(imageView); return imageView; } } private void setLunboData() { // 拿到轮播图的数据 mLunboDatas = mHomeData.top_stories; // 更新轮播图的展示 mLunboAdapter.notifyDataSetChanged(); } }
二.我们现在来分析逻辑
Image may be NSFW.
Clik here to view.
过程上面已经有了,无非就是设置一些能设置的控件,需要从网络拿的数据的过程就是,先从本地拿,本地没有,再去网络拿,然后就解析数据,然后用解析后的数据为轮播图及ListView设置数据,轮播图和ListView都用Adapter,过程也大同小异,前面都讲过了。还是不会的话看代码的注释吧。
三.这里我们专门来讲一下怎样用Gson来解析json数据
1)Gson包复制到libs目录下面
Image may be NSFW.
Clik here to view.
2.从网上拿到json数据,放到HiJson软件下面
Image may be NSFW.
Clik here to view.
3.在项目中专门创建一个bean包,专门放各种Bean类
Image may be NSFW.
Clik here to view.
4.以首页数据为例,我们从网上拿到的数据是这样的
Image may be NSFW.
Clik here to view.
5.接下去放到Hijson里面格式化
Image may be NSFW.
Clik here to view.
6.根据结构创建HomeDataBean
public class HomeDataBean { public String date; public List<HomeListViewData> stories; public List<HomeLunboData> top_stories; // ListView的数据 public class HomeListViewData { public String ga_prefix; public String id; public List<String> images; public String title; public String type; public String multipic; } // 轮播图的数据 public class HomeLunboData { public String ga_prefix; public String id; public String image; public String title; public String type; } }
7.创建Gson对象,调用Gson对象的fromJson方法解析
if (mGson == null) { mGson = new Gson(); } mHomeData = mGson.fromJson(homeJsonData, HomeDataBean.class);
作者:baoyunmian 发表于2016/9/19 16:49:12 原文链接
阅读:136 评论:0 查看评论