Estou tentando fazer meus objetos serem paráveis. No entanto, tenho objetos personalizados e esses objetos têm ArrayList
atributos de outros objetos personalizados que criei.
Qual seria a melhor forma de fazer isso?
fonte
Estou tentando fazer meus objetos serem paráveis. No entanto, tenho objetos personalizados e esses objetos têm ArrayList
atributos de outros objetos personalizados que criei.
Qual seria a melhor forma de fazer isso?
Você pode encontrar alguns exemplos disso aqui , aqui (o código é obtido aqui) e aqui .
Você pode criar uma classe POJO para isso, mas precisa adicionar um código extra para fazê-lo Parcelable
. Dê uma olhada na implementação.
public class Student implements Parcelable{
private String id;
private String name;
private String grade;
// Constructor
public Student(String id, String name, String grade){
this.id = id;
this.name = name;
this.grade = grade;
}
// Getter and setter methods
.........
.........
// Parcelling part
public Student(Parcel in){
String[] data = new String[3];
in.readStringArray(data);
// the order needs to be the same as in writeToParcel() method
this.id = data[0];
this.name = data[1];
this.grade = data[2];
}
@Оverride
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.name,
this.grade});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Student createFromParcel(Parcel in) {
return new Student(in);
}
public Student[] newArray(int size) {
return new Student[size];
}
};
}
Depois de criar essa classe, você pode facilmente passar objetos dessa classe por esse Intent
tipo e recuperar esse objeto na atividade de destino.
intent.putExtra("student", new Student("1","Mike","6"));
Aqui, o aluno é a chave necessária para desagrupar os dados do pacote.
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
Este exemplo mostra apenas String
tipos. Mas você pode agrupar qualquer tipo de dados que desejar. Experimente.
EDIT: Outro exemplo , sugerido por Rukmal Dias .
writeToParcel
método é importante?Aqui está um site para criar uma classe Parcelable a partir da sua classe criada:
http://www.parcelabler.com/
fonte
O IntelliJ IDEA e o Android Studio possuem plugins para isso:
Esses plug-ins geram o código padrão do Android Parcelable com base nos campos da classe.
fonte
1. Importação
Android Parcelable code generator
2. Crie uma classe
3. Gerar> Parcelável no menu
Feito.
fonte
File > Settings... > Plugins
e clique noBrowse repositories...
botão.Quão? Com anotações.
Você simplesmente anota um POJO com uma anotação especial e a biblioteca faz o resto.
Prós:
Contras:
Hrisey
Hrisey é baseado em Lombok . Classe Parcelable usando Hrisey :
Agora você não precisa implementar nenhum método da interface Parcelable. Hrisey irá gerar todo o código necessário durante a fase de pré-processamento.
Hrisey nas dependências de Gradle:
Veja aqui os tipos suportados. O
ArrayList
está entre eles.Instale um plug-in - Hrisey xor Lombok * - para o seu IDE e comece a usar seus incríveis recursos!
* Não ative os plug-ins Hrisey e Lombok juntos ou ocorrerá um erro durante o lançamento do IDE.
Parceler
Classe Parcelable usando o Parceler :
Para usar o código gerado, você pode referenciar a classe gerada diretamente ou através da
Parcels
classe utilidade usandoPara remover a referência
@Parcel
, basta chamar o seguinte método deParcels
classePacote nas dependências Gradle:
Procure no README os tipos de atributos suportados .
AutoParcel
AutoParcel é um AutoValue extensão do que permite a geração de valores Parcelable.
Basta adicionar
implements Parcelable
aos seus@AutoValue
modelos anotados:AutoParcel no arquivo de compilação Gradle:
PaperParcel
O PaperParcel é um processador de anotação que gera automaticamente o código padrão do Parcelable seguro para tipos para Kotlin e Java. O PaperParcel suporta Classes de dados Kotlin, o AutoValue do Google por meio de uma extensão de AutoValue ou apenas objetos comuns de bean Java.
Exemplo de uso de documentos .
Anote sua classe de dados com
@PaperParcel
, implementePaperParcelable
e inclua uma instância estática da JVM,PaperParcelable.Creator
por exemplo:Para usuários do Kotlin, consulte Uso do Kotlin ; Para usuários do AutoValue, consulte Uso do AutoValue .
ParcelableGenerator
ParcelableGenerator (o README está escrito em chinês e eu não o entendo. Contribuições para esta resposta de desenvolvedores que falam inglês-chinês são bem-vindas)
Exemplo de uso do README .
O plug - in android-apt auxilia no trabalho com processadores de anotação em combinação com o Android Studio.
fonte
Eu encontrei a maneira mais simples de criar classe Parcelable
fonte
É muito fácil, você pode usar um plugin no android studio para fazer objetos Parcelables.
fonte
Agora você pode usar a biblioteca Parceler para converter qualquer classe personalizada em parcelável. Apenas anote sua classe POJO com @Parcel . por exemplo
você pode criar um objeto da classe Example e agrupar por meio de encomendas e enviar como um pacote por meio de intenção. por exemplo
Agora, para obter o objeto Classe Personalizada, basta usar
fonte
Pacote Android tem algumas coisas únicas. Estes são dados abaixo:
Exemplo: Para tornar uma classe Parceble, é necessário implementar a Parceble. Percable tem 2 métodos:
Suponha que você tenha uma classe Person e ela possua 3 campos, firstName, lastName e age. Após implementar a interface Parceble. esta interface é apresentada abaixo:
Aqui
writeToParcel
método, estamos escrevendo / adicionando dados no Parcel em um pedido. Depois disso, temos que adicionar o código abaixo para ler os dados do pacote:Aqui, a classe Person está pegando um pacote e obtendo os dados na mesma ordem durante a gravação.
Agora, durante a intenção
getExtra
eputExtra
código, é fornecido abaixo:Colocar no Extra :
Obter extra:
A classe Full Person é dada abaixo :
fonte
Criar classe Parcelable sem plug-in no Android Studio
implementa Parcelable em sua classe e, em seguida, coloque o cursor em "implementa Parcelable" e pressione
Alt+Enter
e selecioneAdd Parcelable implementation
(veja a imagem). é isso aí.fonte
Colocar:
bundle.putSerializable("key",(Serializable) object);
Para obter:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
fonte
ClassCastException
se o objeto não for implementadoSerializable
.