2015-02-25 5 views
0

Я пытаюсь сделать следующий класс применимым. Обычно я делаю это, используя сайт parcelabler. Но на веб-сайте, похоже, есть проблемы с частью ArrayList>. Кто-нибудь знает, как это сделать правильно? Спасибо заранее!Сделать ArrayList <ArrayList <Integer>> parcelable

package com.example.stoos.data; 

import java.util.ArrayList; 

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

public class DataModelDiagrammDaten implements Parcelable { 
ArrayList<String> Antworten = new ArrayList<String>(); 
ArrayList<ArrayList<Integer>> AntwortIDs = new ArrayList<ArrayList<Integer>>(); 

public ArrayList<String> getAntworten() { 
    return Antworten; 
} 

public ArrayList<ArrayList<Integer>> getAntwortIDs() { 
    return AntwortIDs; 
} 

public void setAntworten(ArrayList<String> antworten) { 
    Antworten = antworten; 
} 

public void setAntwortIDs(ArrayList<ArrayList<Integer>> antwortIDs) { 
    AntwortIDs = antwortIDs; 
} 

public DataModelDiagrammDaten(ArrayList<String> antworten, 
     ArrayList<ArrayList<Integer>> antwortIDs) { 
    super(); 
    Antworten = antworten; 
    AntwortIDs = antwortIDs; 
} 



protected DataModelDiagrammDaten(Parcel in) { 
    if (in.readByte() == 0x01) { 
     Antworten = new ArrayList<String>(); 
     in.readList(Antworten, String.class.getClassLoader()); 
    } else { 
     Antworten = null; 
    } 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    if (Antworten == null) { 
     dest.writeByte((byte) (0x00)); 
    } else { 
     dest.writeByte((byte) (0x01)); 
     dest.writeList(Antworten); 
    } 
} 

@SuppressWarnings("unused") 
public static final Parcelable.Creator<DataModelDiagrammDaten> CREATOR = new Parcelable.Creator<DataModelDiagrammDaten>() { 
    @Override 
    public DataModelDiagrammDaten createFromParcel(Parcel in) { 
     return new DataModelDiagrammDaten(in); 
    } 

    @Override 
    public DataModelDiagrammDaten[] newArray(int size) { 
     return new DataModelDiagrammDaten[size]; 
    } 
}; 
} 

ответ

0

EDIT:

Попробуйте поставить второй ArrayList в другом классе, как это:

public class IdsObject implements Parcelable { 

ArrayList<Integer> ids; 

public IdsObject(ArrayList<Integer> ids) { 
this.ids = ids; 
} 


protected IdsObject(Parcel in) { 
    if (in.readByte() == 0x01) { 
     ids = new ArrayList<Integer>(); 
     in.readList(ids, Integer.class.getClassLoader()); 
    } else { 
     ids = null; 
    } 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    if (ids == null) { 
     dest.writeByte((byte) (0x00)); 
    } else { 
     dest.writeByte((byte) (0x01)); 
     dest.writeList(ids); 
    } 
} 

@SuppressWarnings("unused") 
public static final Parcelable.Creator<IdsObject> CREATOR = new Parcelable.Creator<IdsObject>() { 
    @Override 
    public IdsObject createFromParcel(Parcel in) { 
     return new IdsObject(in); 
    } 

    @Override 
    public IdsObject[] newArray(int size) { 
     return new IdsObject[size]; 
    } 
}; 
} 

Затем использовать этот класс в вашем классе, как это:

public class DataModelDiagrammDaten implements Parcelable, Parcelable { 
ArrayList<String> Antworten = new ArrayList<String>(); 
ArrayList<IdsObject> AntwortIDs = new ArrayList<IdsObject>(); 


protected DataModelDiagrammDaten(Parcel in) { 
    if (in.readByte() == 0x01) { 
     Antworten = new ArrayList<String>(); 
     in.readList(Antworten, String.class.getClassLoader()); 
    } else { 
     Antworten = null; 
    } 
    if (in.readByte() == 0x01) { 
     AntwortIDs = new ArrayList<IdsObject>(); 
     in.readList(AntwortIDs, IdsObject.class.getClassLoader()); 
    } else { 
     AntwortIDs = null; 
    } 
} 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    if (Antworten == null) { 
     dest.writeByte((byte) (0x00)); 
    } else { 
     dest.writeByte((byte) (0x01)); 
     dest.writeList(Antworten); 
    } 
    if (AntwortIDs == null) { 
     dest.writeByte((byte) (0x00)); 
    } else { 
     dest.writeByte((byte) (0x01)); 
     dest.writeList(AntwortIDs); 
    } 
} 

@SuppressWarnings("unused") 
public static final Parcelable.Creator<DataModelDiagrammDaten> CREATOR = new Parcelable.Creator<DataModelDiagrammDaten>() { 
    @Override 
    public DataModelDiagrammDaten createFromParcel(Parcel in) { 
     return new DataModelDiagrammDaten(in); 
    } 

    @Override 
    public DataModelDiagrammDaten[] newArray(int size) { 
     return new DataModelDiagrammDaten[size]; 
    } 
}; 
} 
+0

Это та же сторона я использовал, но он говорит «Следующие переменные не были признаны (синтаксическая ошибка?): ArrayList> AntwortIDs» (в красной коробке на начало стороны) –

+0

Можете ли вы изменить эта переменная в ArrayList AntwortIDs = новый ArrayList (); ? – luiscosta

+0

нет, к сожалению, нет, длина массива ist undetermined –

0

Хорошо, я решил. Вот решение, если кто-то другой сталкивается с одной и той же проблемой: Вы можете сначала создать свой класс с нормальным ArrayList (вместо ArrayList>), который можно будет использовать с веб-сайтом. Затем возьмите следующий фрагмент, чтобы записать его в конструктор с аргументом Parcel в этом месте, был ArrayList. Теперь измените свой ArrayList на свой ArrayList>, и он должен работать.

if (in.readByte() == 0x01) { 
     IDs = new ArrayList<ArrayList<Integer>>(); 
     Type collectionType = new TypeToken<ArrayList<Integer>>(){}.getType(); 
     in.readList(IDs, collectionType.getClass().getClassLoader()); 
    } else { 
     IDs = null; 
    } 
+1

Мое решение тоже решает, и я думаю, что это более подходит для того, что вы хотите. – luiscosta

0

Я думаю, что немного поздно, но надеюсь, что это по-прежнему полезно для других. Я попытался написать двумерный массив для посылок, как это:

public class Avatar implements Parcelable { 

ArrayList<Integer> arrayList; 
ArrayList<ArrayList<Integer>> arrayLists; 

public Avatar() { 
    arrayLists = new ArrayList<>(); 
    for (int i = 0; i < 10; i++) { 
     ArrayList<Integer> temp = new ArrayList<>(); 
     for (int j = 0; j < 10; j++) { 
      temp.add(j); 
     } 
     arrayLists.add(temp); 
    } 

    arrayList = new ArrayList<>(); 
    for (int i = 100; i < 104; i++) { 
     arrayList.add(i); 
    } 
} 

protected Avatar(Parcel in) { 
    arrayList = new ArrayList<>(); 
    in.readList(arrayList, Integer.class.getClassLoader()); 
    arrayLists = new ArrayList<>(); 
    in.readList(arrayLists, ArrayList.class.getClassLoader()); 
} 

public static final Creator<Avatar> CREATOR = new Creator<Avatar>() { 
    @Override 
    public Avatar createFromParcel(Parcel in) { 
     return new Avatar(in); 
    } 

    @Override 
    public Avatar[] newArray(int size) { 
     return new Avatar[size]; 
    } 
}; 

@Override 
public int describeContents() { 
    return 0; 
} 

@Override 
public void writeToParcel(Parcel dest, int flags) { 
    dest.writeList(arrayList); 
    dest.writeList(arrayLists); 
} 

@Override 
public String toString() { 
    StringBuilder stringBuilder = new StringBuilder(); 
    for (int i = 0; i < arrayList.size(); i++) { 
     stringBuilder.append(arrayList.get(i) + " "); 
    } 
    for (int i = 0; i < arrayLists.size(); i++) { 
     for (int j = 0; j < arrayLists.get(i).size(); j++) { 
      stringBuilder.append(arrayLists.get(i).get(j) + " "); 
     } 
    } 
    return stringBuilder.toString(); 
} 
} 

И отправить класс в другую активность:

avatar = new Avatar(); 
    Intent intent = new Intent(); 
    intent.setClass(ParcelActivity.this, Parcel2Activity.class); 
    intent.putExtra("avatar", avatar); 
    startActivity(intent); 

получающего в другой деятельности:

textView.setText(getIntent().getParcelableExtra("avatar") + ""); 

Он работает правильно: test

Что должно быть осторожным, так это то, что запись и чтение для полевых объектов в Парцеле должны быть в одной и той же последовательности.

Смежные вопросы