首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Parcelable类

Parcelable类
EN

Stack Overflow用户
提问于 2011-02-24 20:15:11
回答 1查看 3K关注 0票数 0

我有一个下面的类,并希望实现Parcelable。我在中遇到了错误。敬请指教。

代码语言:javascript
运行
复制
 in.readValue(row);

错误消息:类型Parcel中的方法readValue(ClassLoader)不适用于参数(ArrayList)

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;

import android.os.Parcel;
import android.os.Parcelable;

public class cls_datatable implements Parcelable {
private ArrayList<String> column = new ArrayList<String>();
private ArrayList<cls_datarow> row = new ArrayList<cls_datarow>();
private int indexCounter = 0;
private Hashtable<Integer, Integer> IDnIndex = new Hashtable<Integer, Integer>();

public cls_datatable(Parcel in) {
    readFromParcel(in);
}

public class cls_datarow {

    private ArrayList<String> columnValues;
    private int id;

    public cls_datarow(int id) {
        this.id = id;
        columnValues = new ArrayList<String>();
        for (int i = 0; i < column.size(); i++)
            columnValues.add(null);
    }

    public cls_datarow() {
        columnValues = new ArrayList<String>();
        for (int i = 0; i < column.size(); i++)
            columnValues.add(null);
    }

    public int getID() {
        return id;
    }

    public String get(String columnName) {
        return columnValues.get(column.indexOf(columnName));
    }

    public String get(int columnIndex) {
        return columnValues.get(columnIndex);
    }

    public void set(String columnName, String value) {
        columnValues.set(column.indexOf(columnName), value);
    }

    public void set(int columnIndex, String value) {
        columnValues.set(columnIndex, value);
    }

    public int getColumnSize() {
        return column.size();
    }
}

public void addColumn(String columnName) {
    column.add(columnName);
}

// Depreciated function
public void addAllColumns(ArrayList<String> columns) {
    column.addAll(columns);
}

public void addAllColumns(String[] columns) {
    for (String col : columns) {
        column.add(col);
    }
}

public int getColumnSize() {
    return column.size();
}

public int getColumnIndex(String columnName) {
    return column.indexOf(columnName);
}

public int getRowSize() {
    return row.size();
}

public cls_datarow getRow(int rowIndex) {
    return row.get(rowIndex);
}

public void remove(int rowIndex) {
    row.remove(rowIndex);
    refreshIDnIndex();
}

public void remove(cls_datarow dataRow) {
    row.remove((int) IDnIndex.get(dataRow.getID()));
    refreshIDnIndex();
}

public void update(cls_datarow dataRow) {
    row.set(IDnIndex.get(dataRow.getID()), dataRow);
}

public void add(cls_datarow row) {
    IDnIndex.put(row.getID(), this.row.size());
    this.row.add(row);
}

public void addAllRows(ArrayList<cls_datarow> row) {
    for (cls_datarow r : row) {
        IDnIndex.put(r.getID(), this.row.size());
        this.row.add(r);
    }
}

public cls_datarow newRow() {
    cls_datarow dr = new cls_datarow(indexCounter);
    indexCounter++;
    return dr;
}

public cls_datatable copy() {
    cls_datatable dt = new cls_datatable(null);
    dt.addAllColumns(column);
    dt.addAllRows(row);
    return dt;
}

// inappropriate method
public ArrayList<cls_datarow> getAllRows() {
    return row;
}

public void clear() {
    row.clear();
}

public cls_datarow[] select(HashMap<String, String> condition) {
    ArrayList<cls_datarow> rs = new ArrayList<cls_datarow>();
    boolean isMatch = true;
    Iterator<String> i;

    for (cls_datarow r : row) {
        isMatch = true;
        i = condition.keySet().iterator();
        while (i.hasNext()) {
            String key = i.next();
            if (r.get(key) == null && condition.get(key) != null)
                isMatch = false;
            if (r.get(key) != null && condition.get(key) == null)
                isMatch = false;
            if (r.get(key) != null && condition.get(key) != null
                    && !r.get(key).equals(condition.get(key)))
                isMatch = false;
        }

        if (isMatch)
            rs.add(r);
    }

    return rs.toArray(new cls_datarow[rs.size()]);
}

private void refreshIDnIndex() {
    IDnIndex.clear();
    for (int i = 0; i < row.size(); i++)
        IDnIndex.put(row.get(i).getID(), i);
}

@Override
public int describeContents() {
    // TODO Auto-generated method stub
    return 0;
}


@Override
public void writeToParcel(Parcel dest, int flags) {

    // We just need to write each field into the
    // parcel. When we read from parcel, they
    // will come back in the same order
    dest.writeStringList(column);
    dest.writeValue(row);
    dest.writeInt(indexCounter);
    dest.writeValue(IDnIndex);
}

private void readFromParcel(Parcel in) {

    // We just need to read back each
    // field in the order that it was
    // written to the parcel
    in.readStringList(column);
     in.readValue(row);
    //indexCounter
    //IDnIndex
}


public static final Parcelable.Creator CREATOR =
    new Parcelable.Creator() {
        public cls_datatable createFromParcel(Parcel in) {
            return new cls_datatable(in);
        }

        public cls_datatable[] newArray(int size) {
            return new cls_datatable[size];
        }
    };

}

EN

回答 1

Stack Overflow用户

发布于 2011-02-24 21:51:39

出现这个错误是因为readValue需要一个ClassLoader类型的对象,而您向它传递的是一个ArrayList。但你更大的问题是,你不能简单地打包和解包任何类型的对象列表。请查看writeValue的文档:

http://developer.android.com/reference/android/os/Parcel.html#writeValue(java.lang.Object

您的类cls_datarow需要由此方法以某种方式支持。我只需要让cls_datarow实现Paracable,并使用writeTypedList编写它,使用createTypedArrayList读取它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5104508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档