Parcelable类 [英] Parcelable class

查看:119
本文介绍了Parcelable类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下类,并想实现Parcelable。
我打错误,请指点。

I have a class below and would like to implement Parcelable. I hit the error in. Please advice.

 in.readValue(row);

错误消息:在类型地块的方法readValue器(classloader)不适用于参数(ArrayList的)

Error Message: The method readValue(ClassLoader) in the type Parcel is not applicable for the arguments (ArrayList)

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];
        }
    };

}

推荐答案

这个错误是因为 readValue 期望类型的对象的ClassLoader 和你传递一个的ArrayList 。但是,你的更大的问题是,你不能只是包裹和unparcel任何类型的对象的列表。看看为writeValue的文档:

The error is because readValue is expecting an object of type ClassLoader and you are passing it an ArrayList. But your bigger problem is that you can't just parcel and unparcel a list of objects of any type. Look at the documentation for writeValue:

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

您的类 cls_datarow 需要通过这种方法在某种程度上支持。我只想有 cls_datarow 实施 Paracable ,并使用 writeTypedList 来写和 createTypedArrayList 读它。

Your class cls_datarow needs to be supported by this method somehow. I would just have cls_datarow implement Paracable and use writeTypedList to write it and createTypedArrayList to read it.

这篇关于Parcelable类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆