[原创]如何在Parcelable中使用泛型

实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示:

     public static class ProductModel implements Parcelable {
public String id;
public String title;
public String sold_num;
public String max_month;
public String cprice;
public double month_price;
public List<String> gpic; @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.id);
dest.writeString(this.title);
dest.writeString(this.sold_num);
dest.writeString(this.max_month);
dest.writeString(this.cprice);
dest.writeDouble(this.month_price);
dest.writeStringList(this.gpic);
} public ProductModel() {
} protected ProductModel(Parcel in) {
this.id = in.readString();
this.title = in.readString();
this.sold_num = in.readString();
this.max_month = in.readString();
this.cprice = in.readString();
this.month_price = in.readDouble();
this.gpic = in.createStringArrayList();
} public static final Creator<ProductModel> CREATOR = new Creator<ProductModel>() {
public ProductModel createFromParcel(Parcel source) {
return new ProductModel(source);
} public ProductModel[] newArray(int size) {
return new ProductModel[size];
}
};

CREATOR在这里成为了一个约定,而没有放到接口定义里面,个人感觉这样封装得不是很好,不知道是不是实在没有更好的解决办法才弄成这样的?

假如在类里要使用泛型,麻烦就来了,例如这样

 public class PageDataModel<T extends Parcelable> extends APIDataModel {

     static final String DATA_KEY = "data";

     /**
* count : 1
* total_pages : 1
* list_rows : 10
* first_row : 0
*/ public int count;
public ArrayList<T> data;
public int total_pages;
public int list_rows;
public int first_row;
}

这个data,就无法正常read(write倒是可以)。

正常的write方式是这样的:

this.data = dest.createTypedArrayList(Parcelable.Creator<T> c)

那么问题来了,你只有一个泛型T,没有具体类型,拿不到它的CREATOR!CREATOR只是一个约定,而且是跟具体类型绑定的。

所以我前面说如果这个CREATOR能通过某种方式定义下来,这里或许就能拿到了,然而并没有。

但是android系统你是改变不了的,我们仍然要解决问题。经过多番调查尝试之后,终于找到了解决办法:

Pacel是可以读取和写入Bundle对象的,而Bundle对象又可以读取和写入Parcelable,而且不需要CREATOR(为啥Parcel不能设计成这样,坑爹呢。。)

那么 我们把泛型数据用Bundle包装一下即可,下面是具体代码,亲测有效,总算解决这个问题了。

 //write
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(DATA_KEY, data);
dest.writeBundle(bundle); //read
this.data = in.readBundle().getParcelableArrayList(DATA_KEY);

[原创]如何在Parcelable中使用泛型的更多相关文章

  1. (原创)如何在spannableString中使用自定义字体

    最近在做车联网的产品,主打的是语音交互和导航功能,UI给的导航界面可真是够酷炫的.但麻烦的事情也来了,里面的一句话居然用到了三种字体.界面如图所示: 从图中可以看出 500m左前方行驶 居然使用了三种 ...

  2. 【原创】如何在Android中为TextView动态设置drawableLeft等

    如何在Android中为TextView动态设置drawableLeft等   两种方式:   方式1:手动设置固有边界 Drawable drawable = getResources().getD ...

  3. 6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  4. 如何在Dreamweaver中使用emmet

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=3666 一.emmet ...

  5. 如何在Android中使用OpenCV

    如何在Android中使用OpenCV 2011-09-21 10:22:35 标签:Android 移动开发 JNI OpenCV NDK 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始 ...

  6. MVC如何在Pipeline中接管请求的?

    MVC如何在Pipeline中接管请求的? 文章内容 上个章节我们讲到了,可以在HttpModules初始化之前动态添加Route的方式来自定义自己的HttpHandler,最终接管请求的,那MVC是 ...

  7. 服务化改造实践 | 如何在 Dubbo 中支持 REST

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) “架构风格以及基于网络的软件架构设计” 中提出来的 ...

  8. Nodejs的安装配置及如何在sublimetext2中运行js

    Nodejs的安装配置及如何在sublimetext2中运行js听语音 | 浏览:4554 | 更新:2015-06-16 11:29 Nodejs的安装配置及如何在sublimetext2中运行js ...

  9. Scala进阶之路-Scala中的泛型介绍

    Scala进阶之路-Scala中的泛型介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 通俗的讲,比如需要定义一个函数,函数的参数可以接受任意类型.我们不可能一一列举所有的参数类 ...

随机推荐

  1. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列

    ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  http://www.cnblogs.com/panzi/p/5742089.html ASP.NET S ...

  2. 51nod1256(乘法逆元)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1256 题意:中文题诶~ 思路: M, N 互质, 求满足 K ...

  3. 【Java EE 学习 23】【log4j的使用】【ant的使用】【内省】

    一.ant下载地址:http://ant.apache.org/bindownload.cgi  二.log4j下载地址:http://logging.apache.org/log4j/2.x/dow ...

  4. Hadoop 大数据第一天

    大数据第一天 1.Hadoop生态系统 1.1 Hadoop v1.0 架构 MapReduce(用于数据计算) HDFS(用于存储数据) 1.2 Hadoop v2.0 架构 MapReduce(用 ...

  5. sublime-生成html1.0

    文件--新建--输入--html:xt--CTRL+E.生成html1.0

  6. [数据库]cakephp操作ENUM、tinyint等类型的一点说明

    之前无法正常更新ENUM类型的数据,感觉是框架函数实现的bug. 问题很诡异,因为INIT的时候是可以成功写入的,没理由UPDATE的时候不成功. 前后琢磨了一下午,发现了一点蛛丝马迹才终于想通.问题 ...

  7. sql ce4 的问题

    前面用sql ce4来做数据库,发现一个问题.在localhos:xxx下面速度很快,但是一放到iis上面,速度变慢了.每个查询要13秒.分析了好久,最后,查找了半天的资料,去掉了数据库的密码.速度快 ...

  8. 随堂笔记javascript篇之chrome调试:

    在征求到许老师的同意之后,我用javascript脚本语言来完成我的课堂作业,初学一门语言,刚开始也许是初生牛犊不怕虎,接受一门新的语言而且用来完成作业.一开始老师是拒绝的,他说我这样是太麻烦了.对于 ...

  9. Qt里获取目录的一个另类方法

    如果有一个文件的全路径文件名, 想获取它的路径的话, qt里我没找到比较好的办法, 都是cleanPath后, 再用QString的find, left这种函数来处理. 今天又在搞这种问题的时候, 看 ...

  10. ZeroMQ接口函数之 :zmq_socket – 创建ZMQ套接字

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ZeroMQ 官方地址:http://api.zeromq.org/4 ...