1.解析json数据:

  1. public class PhotosData {
  2. public int retcode;
  3. public PhotosInfo data;
  4. public class PhotosInfo {
  5. public String title;
  6. public ArrayList<PhotoInfo> news;
  7. }
  8. public class PhotoInfo {
  9. public String id;
  10. public String listimage;
  11. public String pubdate;
  12. public String title;
  13. public String type;
  14. public String url;
  15. }
  16. }

2.布局:
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent" >
  4. <ListView
  5. android:id="@+id/lv_photo"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. android:cacheColorHint="#fff"
  9. android:divider="@null" />
  10. <GridView
  11. android:id="@+id/gv_photo"
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent"
  14. android:numColumns="2"
  15. android:visibility="gone" />
  16. </FrameLayout>
使用同一个子布局,同一个adapter
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="vertical" >
  5. <LinearLayout
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. android:layout_margin="10dp"
  9. android:background="@drawable/pic_list_item_bg"
  10. android:gravity="center"
  11. android:orientation="vertical" >
  12. <ImageView
  13. android:id="@+id/iv_pic"
  14. android:layout_width="match_parent"
  15. android:layout_height="180dp"
  16. android:scaleType="centerCrop"
  17. android:src="@drawable/news_pic_default" />
  18. <TextView
  19. android:id="@+id/tv_title"
  20. android:layout_width="match_parent"
  21. android:layout_height="wrap_content"
  22. android:padding="10dp"
  23. android:text="标题"
  24. android:singleLine="true"
  25. android:textColor="#000"
  26. android:textSize="22sp" />
  27. </LinearLayout>
  28. </LinearLayout>
3.菜单详情页—组图
  1. public static final String PHOTOS_URL = SERVER_URL
  2. + "/photos/photos_1.json";// 获取组图信息的接口
  1. public class PhotoMenuDetailPager extends BaseMenuDetailPager {
  2. private ListView lvPhoto;
  3. private GridView gvPhoto;
  4. private ArrayList<PhotoInfo> mPhotoList;
  5. private PhotoAdapter mAdapter;
  6. private ImageButton btnPhoto;
  7. public PhotoMenuDetailPager(Activity activity, ImageButton btnPhoto) { super(activity);
  8. this.btnPhoto = btnPhoto;
  9. //这样就把imagebutton传了过来,好方法。在构造函数里传
  10. btnPhoto.setOnClickListener(new OnClickListener() {
  11. @Override
  12. public void onClick(View v) {
  13. changeDisplay();
  14. }
  15. });
  16. }
  17. @Override
  18. public View initViews() {
  19. View view = View.inflate(mActivity, R.layout.menu_photo_pager, null);
  20. lvPhoto = (ListView) view.findViewById(R.id.lv_photo);
  21. gvPhoto = (GridView) view.findViewById(R.id.gv_photo);
  22. return view;
  23. }
  24. @Override
  25. public void initData() {
  26. String cache = CacheUtils
  27. .getCache(GlobalContants.PHOTOS_URL, mActivity);
  28. if (!TextUtils.isEmpty(cache)) {
  29. }
  30. getDataFromServer();
  31. }
  32. private void getDataFromServer() {
  33. HttpUtils utils = new HttpUtils();
  34. utils.send(HttpMethod.GET, GlobalContants.PHOTOS_URL,
  35. new RequestCallBack<String>() {
  36. @Override
  37. public void onSuccess(ResponseInfo<String> responseInfo) {
  38. String result = (String) responseInfo.result;
  39. parseData(result);
  40. // 设置缓存
  41. CacheUtils.setCache(GlobalContants.PHOTOS_URL, result,
  42. mActivity);
  43. }
  44. @Override
  45. public void onFailure(HttpException error, String msg) {
  46. Toast.makeText(mActivity, msg, Toast.LENGTH_SHORT)
  47. .show();
  48. error.printStackTrace();
  49. }
  50. });
  51. }
  52. protected void parseData(String result) {
  53. Gson gson = new Gson();
  54. PhotosData data = gson.fromJson(result, PhotosData.class);
  55. mPhotoList = data.data.news;// 获取组图列表集合
  56. if (mPhotoList != null) {
  57. mAdapter = new PhotoAdapter();
  58. lvPhoto.setAdapter(mAdapter);
  59. gvPhoto.setAdapter(mAdapter);
  60. }
  61. }
  62. class PhotoAdapter extends BaseAdapter {
  63. private BitmapUtils utils;
  64. public PhotoAdapter() {
  65. utils = new BitmapUtils(mActivity);
  66. utils.configDefaultLoadingImage(R.drawable.news_pic_default);
  67. }
  68. @Override
  69. public int getCount() {
  70. return mPhotoList.size();
  71. }
  72. @Override
  73. public PhotoInfo getItem(int position) {
  74. return mPhotoList.get(position);
  75. }
  76. @Override
  77. public long getItemId(int position) {
  78. return position;
  79. }
  80. @Override
  81. public View getView(int position, View convertView, ViewGroup parent) {
  82. ViewHolder holder;
  83. if (convertView == null) {
  84. convertView = View.inflate(mActivity, R.layout.list_photo_item,
  85. null);
  86. holder = new ViewHolder();
  87. holder.tvTitle = (TextView) convertView
  88. .findViewById(R.id.tv_title);
  89. holder.ivPic = (ImageView) convertView
  90. .findViewById(R.id.iv_pic);
  91. convertView.setTag(holder);
  92. } else {
  93. holder = (ViewHolder) convertView.getTag();
  94. }
  95. PhotoInfo item = getItem(position);
  96. holder.tvTitle.setText(item.title);
  97. utils.display(holder.ivPic, item.listimage);
  98. return convertView;
  99. }
  100. }
  101. static class ViewHolder {
  102. public TextView tvTitle;
  103. public ImageView ivPic;
  104. }
  105. private boolean isListDisplay = true;// 是否是列表展示
  106. /**
  107. * 切换展现方式
  108. */
  109. private void changeDisplay() {
  110. if (isListDisplay) {
  111. isListDisplay = false;
  112. lvPhoto.setVisibility(View.GONE);
  113. gvPhoto.setVisibility(View.VISIBLE);
  114. btnPhoto.setImageResource(R.drawable.icon_pic_list_type);
  115. } else {
  116. isListDisplay = true;
  117. lvPhoto.setVisibility(View.VISIBLE);
  118. gvPhoto.setVisibility(View.GONE);
  119. btnPhoto.setImageResource(R.drawable.icon_pic_grid_type);
  120. }
  121. }
  122. }
4.其他
在basepager里添加这样一个按钮,并findviewbyid出来,因为菜单是新闻中心里才有的,组图是菜单里的一项
  1. <ImageButton
  2. android:id="@+id/btn_photo"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:layout_alignParentRight="true"
  6. android:layout_centerVertical="true"
  7. android:layout_marginRight="5dp"
  8. android:background="@null"
  9. android:src="@drawable/icon_pic_grid_type"
  10. android:visibility="gone" />
新闻中心页面setCurrentMenuDetailPager中
  1. if (pager instanceof PhotoMenuDetailPager) {
  2. btnPhoto.setVisibility(View.VISIBLE);
  3. } else {
  4. btnPhoto.setVisibility(View.GONE);
  5. }






12、json、GridView、缓存的更多相关文章

  1. 循序渐进学.Net Core Web Api开发系列【12】:缓存

    系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...

  2. asp.net mvc json数据缓存

    一些虚拟主机资源给的少, 如果直接用框架缓存, 估计内存就爆了吧, 如果不用缓存, 虚拟主机自带的数据库也是限制资源的, 访问多了就直接给timeout了, 用json文件形式缓存查询出来的数据, 虽 ...

  3. ajax访问json文件缓存问题

    ajax访问json文件,json文件改动,访问的时候也不能及时看到改动后的内容. 这是因为浏览器缓存的原因. 在这时候就需要清除浏览器的缓存或者加上一个标记,让ajax访问文件的时候知道这是一个新的 ...

  4. 从微信小程序到鸿蒙js开发【12】——storage缓存&自动登录

    鸿蒙入门指南,小白速来!从萌新到高手,怎样快速掌握鸿蒙开发?[课程入口] 正文: 在应用开发时,我们常需要将一些数据缓存到本地,以提升用户体验.比如在一个电商的app中,如果希望用户登录成功后,下次打 ...

  5. 2015.05.12:json的常用处理方式

    1:json的介绍:json常用于前台与后台的数据传输  传递时需将json对象转换为json字符 JSON.stringify(); 2:json格式的查看应用:JsonView 3:后台获取到js ...

  6. 12.19 redis缓存

    ---恢复内容开始--- 命中:应用程序从key中获取数据,取到后返回 失效:到设置的失效时间后就失效 更新:应用程序把数据存到数据库中后又放回去 在项目中使用redis方法 结合业务场景,避免滥用 ...

  7. 12、pytest -- 缓存:记录执行的状态

    目录 1. cacheprovider插件 1.1. --lf, --last-failed:只执行上一轮失败的用例 1.2. --ff, --failed-first:先执行上一轮失败的用例,再执行 ...

  8. Pytest(12)pytest缓存

    前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...

  9. GridView控件

    GridView是ASP.NET 1.x的DataGrid控件的后继者.它提供了同样的基本功能集,同一时候添加�了大量扩展和改进.如前所述,DataGrid(ASP.NET 2.0仍然全然支持)是一个 ...

  10. asp.net实现SQL2005的通知数据缓存

    首先第一步是确保您的 Service Broker 已经激活,激活 Service Broker (Transact-SQL)如下: USE master ; GO ALTER DATABASE Yo ...

随机推荐

  1. PyCharm中 Django1.11配置Mysql数据库

    1.Django 中配置MySQL数据库 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名称 ...

  2. statrc部分

    statrc部分 1. 如何使用 #- 在app中编写 stark.py #- 在stark.py中进行定制 #- 默认配置: #site.register(models.UserInfo) #- 自 ...

  3. CentOS7 Failed to start LSB: Bring up/down解决方法

    刚刚装好的虚拟机突然不能上网了,报错很诡异,具体报错如下: /etc/init.d/network restart Restarting network (via systemctl):  Job f ...

  4. Nginx和PHP-FPM的启动、重启、停止脚本分享

    这篇文章主要介绍了Nginx和PHP-FPM的启动.重启.停止脚本分享,脚本中包含start.stop.reload.restart等常用的管理方法,并可以加入系统服务然后使用servicem命令管理 ...

  5. IP报文头详解

    IPv4报头: 报头长度:20-60字节bytes 白色部分为固定头部部分(20 bytes),绿色option选项部分为可选部分. 固定头部大小计算: 4bit + 4bit + 8bit + 16 ...

  6. 超简单的全新win10安装

    1.准备工作! 这里说一下需要装系统的东西: 至少8G的U盘或内存卡 一台Windows电脑 在要安装的电脑上至少有16G的空间,最好至少64G. 2.现成电脑下载文件(已经有重装系统U盘跳过这一步) ...

  7. How to Reset VW Steering Assist 1S1909144P with OBDSTAR X300 DP

    Vehicle model:VW Polo 2015 (or other Audi, Seat, Skoda, VW with unit 1S1 909 144 P) Module:Control u ...

  8. LR回放https协议脚本失败:[GENERAL_MSG_CAT_SSL_ERROR]connect to host "XXX" failed:[10054] Connection reset by peer [MsgId:MERR-27780]

    Loadrunner默认发送是通过sockets(将http转换为sockets)发送的,而sockets默认SSL的版本为SSL2和SSL3.HTTPS协议录制的脚本以SSL3版本回放时会使sock ...

  9. axios封装get方法和post方法

    我们常用的ajax请求方法有get.post.put等方法,相信小伙伴都不会陌生.axios对应的也有很多类似的方法,不清楚的可以看下文档.但是为了简化我们的代码,我们还是要对其进行一个简单的封装.下 ...

  10. 第二阶段第五次spring会议

    昨天我对软件加上了写便签时自动加上时间的功能. 今天我将对初始页面进行加工和修改. 我用两个小动物作为按钮分别进入动物便签界面和植物便签界面,可以让用户自由选择. 明天我将尝试对软件进行添加搜索引擎的 ...