관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[안드로이드] ArrayList , 사용자가 만든 객체 부가 데이터 전달 예제 본문

안드로이드/자바 & Previous

[안드로이드] ArrayList , 사용자가 만든 객체 부가 데이터 전달 예제

막무가내막내 2019. 3. 23. 21:27
728x90

ArrayList나 사용자가 만든 객체를 액티비티끼로 서로 전달하고 받는 과정을 예제로 기록해본다.

기본타입이 아닌 리스트 또는 객체를 받아올때 단순 get000Extra로 받아올 수 가 없다.


*메인액티비티( ArrayList 값과 SimpleData라는 내가 만든 객체를 전달해준다. intent.putExtra로 기본타입과 보내는 방식은 똑같으나 받는 방식이 나중에 보면 다르다. )

Intent intent = new Intent(getApplicationContext(), MenuActivity.class);
ArrayList<String> names = new ArrayList<String>();
names.add("김진수");
names.add("황수연");

intent.putExtra("names", names);

SimpleData data = new SimpleData(100, "Hello");
intent.putExtra("data", data);

startActivityForResult(intent, 101);


*SimpleData ( 사용자가 만든 객체를 데이터로 전달하기위해서는 Parcelable을 구현해야 한다. 실제로 Paracelable을 사용해서 데이터전달을 많이 한다고 들었다. 왜냐하면 Serializable 보다 더 성능이 좋기 때문이다. 

해당 설명은 https://youngest-programming.tistory.com/108 에 정리해놨다.)


밑에처럼 직접 구현해도 되고 

Parcelable code generator플러그인을 다운 받아서 윈도우기준 알트엔터(generater)로 자동으로 만들 수 도 있다. (난 이것을 추천하고 사용하고있다.)

public class SimpleData implements Parcelable {

int number;
String message;

public SimpleData(int number, String message) {
this.number = number;
this.message = message;
}

public SimpleData(Parcel src) {
number = src.readInt();
message = src.readString();
}

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

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

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

@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(number);
dest.writeString(message);
}
}



*메뉴액티비티(데이터를 전달 받을 다른액티비티) 

=> ArrayList는 Sierializable가 기본적으로 implements이 되있어서 getSerializableExtra를 이용해 전달받은 데이터를 꺼내올 수 있다.

그리고 내가 만든 객체인 SimpleData Parcelable을 구현했으니 getPaecelableExtra를 사용해서 받아올 수 있다.


//메인엑티비티에서 전달된 인텐트가 여기저장됨
Intent passedIntent = getIntent();

processIntent(passedIntent);
private  void processIntent(Intent intent){
if(intent!=null){
//인텐트에서 엑스트라데이터가 들어가있으니깐 엑스트라데이터를얻어옴
//여기선 getExtra가아닌 getSerial로 해서 아까 ArrayList를 구현한거를 빼올수있음
// (ArrayList가 Serializable을 implements 했으므로 가능
//즉 한가지데이터가아닌 이런 자료구조나 객체를 전달받을떄 사용함
ArrayList<String> names = (ArrayList<String>) intent.getSerializableExtra("names");
if(names != null){
Toast.makeText(getApplicationContext(), "전달받은 이름 리스트 갯수 : " + names.size(), Toast.LENGTH_LONG).show();

}

SimpleData data = intent.getParcelableExtra("data");
if(data != null){
Toast.makeText(getApplicationContext(), "전달받은 심플데이터 : " + data.message, Toast.LENGTH_LONG).show();
}
}
}

'


[2020 업데이트] 다음과 같이 어노테이션으로 쉽게 Parcel 설정이 가능합니다.

@Parcelize
data class User(
var id: String = "",
var name: String = "",
var fcm: String = "",
var email: String = "",
var pw: String = "",
var image: String = ""
) : Parcelable



좋은 추가 예제 및 설명 사이트 : https://developer88.tistory.com/64

https://www.edwith.org/boostcourse-android/lecture/17066/


728x90
Comments