이 글은 Notion에서 작성 후 재편집한 포스트입니다.
목차
개요
안드로이드 작업을 하다보면 같은 이름에 숫자만 붙여서 여러개 변수를 생성하고, 연결시켜주는 작업을 굉장히 많이한다.
뭐 예를들면..
<TextView
android:id="@+id/posBestCommDisLike1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="비추 수"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
/>
<TextView
android:id="@+id/posBestCommLike1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:layout_toLeftOf="@+id/posBestCommDisLike1"
android:text="따봉 수" />
<ImageView
android:id="@+id/posBestCommLikeImg1"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_toLeftOf="@id/posBestCommLike1"
android:layout_centerVertical="true"
android:src="@drawable/ic_thumb_up_black_24dp"/>
<ImageView
android:id="@+id/posBestCommDisLikeImg1"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_toLeftOf="@id/posBestCommDisLike1"
android:layout_centerVertical="true"
android:src="@drawable/ic_thumb_down_black_24dp"/>
<TextView
android:id="@+id/posBestCommDisLike2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="비추 수"
android:layout_alignParentRight="true"
android:layout_marginRight="20dp"
/>
<TextView
android:id="@+id/posBestCommLike2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="30dp"
android:layout_toLeftOf="@+id/posBestCommDisLike2"
android:text="따봉 수" />
<ImageView
android:id="@+id/posBestCommLikeImg2"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_toLeftOf="@id/posBestCommLike2"
android:layout_centerVertical="true"
android:src="@drawable/ic_thumb_up_black_24dp"/>
<ImageView
android:id="@+id/posBestCommDisLikeImg2"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_toLeftOf="@id/posBestCommDisLike2"
android:layout_centerVertical="true"
android:src="@drawable/ic_thumb_down_black_24dp"/>
.
.
.
.
.
이런거?
이런게 5개 있다고 치자.
XML에서야 뭐 그렇다 쳐도, 이걸 ㅋㅋ java파일에서 사용하려면..
TextView negBestCommId1 = view.findViewById(R.id.negBestCommId1);
TextView negBestCommCon1 = view.findViewById(R.id.negBestCommCon1);
ImageView negBestCommLikeImg1 = view.findViewById(R.id.posBestCommLikeImg1);
ImageView negBestCommDisLikeImg1 = view.findViewById(R.id.posBestCommDisLikeImg1);
TextView negBestCommLike1 = view.findViewById(R.id.negBestCommLike1);
TextView negBestCommDisLike1 = view.findViewById(R.id.negBestCommDisLike1);
TextView negBestCommId2 = view.findViewById(R.id.negBestCommId2);
TextView negBestCommCon2 = view.findViewById(R.id.negBestCommCon2);
ImageView negBestCommLikeImg2 = view.findViewById(R.id.negBestCommLikeImg2);
ImageView negBestCommDisLikeImg2 = view.findViewById(R.id.negBestCommDisLikeImg2);
TextView negBestCommLike2 = view.findViewById(R.id.negBestCommLike2);
TextView negBestCommDisLike2 = view.findViewById(R.id.negBestCommDisLike2);
TextView negBestCommId3= view.findViewById(R.id.negBestCommId3);
TextView negBestCommCon3 = view.findViewById(R.id.negBestCommCon3);
ImageView negBestCommLikeImg3 = view.findViewById(R.id.negBestCommLikeImg3);
ImageView negBestCommDisLikeImg3 = view.findViewById(R.id.negBestCommDisLikeImg3);
TextView negBestCommLike3 = view.findViewById(R.id.negBestCommLike3);
TextView negBestCommDisLike3 = view.findViewById(R.id.negBestCommDisLike3);
TextView negBestCommId4 = view.findViewById(R.id.negBestCommId4);
TextView negBestCommCon4 = view.findViewById(R.id.negBestCommCon4);
ImageView negBestCommLikeImg4 = view.findViewById(R.id.negBestCommLikeImg4);
ImageView negBestCommDisLikeImg4 = view.findViewById(R.id.negBestCommDisLikeImg4);
TextView negBestCommLike4 = view.findViewById(R.id.negBestCommLike4);
TextView negBestCommDisLike4 = view.findViewById(R.id.negBestCommDisLike4);
TextView negBestCommId5 = view.findViewById(R.id.negBestCommId5);
TextView negBestCommCon5 = view.findViewById(R.id.negBestCommCon5);
ImageView negBestCommLikeImg5 = view.findViewById(R.id.negBestCommLikeImg5);
ImageView negBestCommDisLikeImg5 = view.findViewById(R.id.negBestCommDisLikeImg5);
TextView negBestCommLike5 = view.findViewById(R.id.negBestCommLike5);
TextView negBestCommDisLike5 = view.findViewById(R.id.negBestCommDisLike5);
HashMap<String, String> map1 = emotionCommentsArrayList.get(5);
HashMap<String, String> map2 = emotionCommentsArrayList.get(6);
HashMap<String, String> map3 = emotionCommentsArrayList.get(7);
HashMap<String, String> map4 = emotionCommentsArrayList.get(8);
HashMap<String, String> map5 = emotionCommentsArrayList.get(9);
negBestCommId1.setText(map1.get("usrName"));
negBestCommCon1.setText(map1.get("comments"));
negBestCommLike1.setText(map1.get("sympathyCount"));
negBestCommDisLike1.setText(map1.get("antipathyCount"));
negBestCommId2.setText(map2.get("usrName"));
negBestCommCon2.setText(map2.get("comments"));
negBestCommLike2.setText(map2.get("sympathyCount"));
negBestCommDisLike2.setText(map2.get("antipathyCount"));
negBestCommId3.setText(map3.get("usrName"));
negBestCommCon3.setText(map3.get("comments"));
negBestCommLike3.setText(map3.get("sympathyCount"));
negBestCommDisLike3.setText(map3.get("antipathyCount"));
negBestCommId4.setText(map4.get("usrName"));
negBestCommCon4.setText(map4.get("comments"));
negBestCommLike4.setText(map4.get("sympathyCount"));
negBestCommDisLike4.setText(map4.get("antipathyCount"));
negBestCommId5.setText(map5.get("usrName"));
negBestCommCon5.setText(map5.get("comments"));
negBestCommLike5.setText(map5.get("sympathyCount"));
negBestCommDisLike5.setText(map5.get("antipathyCount"));
ㄹㅇㅋㅋ 한눈에 보기에도 구데기같은 코드라고 할 수 있다. 이런 방식을 쓰고있던 내 자신을 혼내주도록 하자아무튼, 이걸 for문으로 돌려서 mapping 해주는 방식을 알아보자. 생각보다 정말 쉬우니 천천히 따라해보자.
참고
okky.kr/article/819296?note=2151849
간단하게 사용법만 알고싶다면 아래 블로그를 참조하자
진행 과정
getIdentifier 사용하기
getIdentifier 라는 친구를 사용하면 된다!
먼저 내 코드를 참고로 살펴보자.
TextView[] commId = new TextView[emotionCommentsArrayList.size()];
TextView[] commCon = new TextView[emotionCommentsArrayList.size()];
TextView[] commLike = new TextView[emotionCommentsArrayList.size()];
TextView[] commDislike = new TextView[emotionCommentsArrayList.size()];
int cnt = 0;
int negIdCnt = 1;
//부정 댓글 탑 5 뽑기
for (int i = 0; i < emotionCommentsArrayList.size(); i++) {
if (cnt == 5)
break;
if (emotionCommentsArrayList.get(i).get("emotionBool").toString().equals("0")) {
String usrName = emotionCommentsArrayList.get(i).get("usrName").toString();
String comments = emotionCommentsArrayList.get(i).get("comments").toString();
String sympathyCount = emotionCommentsArrayList.get(i).get("sympathyCount").toString();
String antipathyCount = emotionCommentsArrayList.get(i).get("antipathyCount").toString();
int id = getResources().getIdentifier("negBestCommId" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int con = getResources().getIdentifier("negBestCommCon" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int like = getResources().getIdentifier("negBestCommLike" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int dislike = getResources().getIdentifier("negBestCommDisLike" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
negIdCnt++;
commId[i] = view.findViewById(id);
commCon[i] = view.findViewById(con);
commLike[i] = view.findViewById(like);
commDislike[i] = view.findViewById(dislike);
if (commId[i] == null)
break;
commId[i].setText(usrName);
commCon[i].setText(comments);
commLike[i].setText(sympathyCount);
commDislike[i].setText(antipathyCount);
cnt++;
} else {
continue;
}
}
현재 이 작업을 진행하는 것은 Fragment이고, negBestCommId, negBestCommCon, negBestCommLike, negBestCommDisLike 라는 TextView가 각각 5개씩 존재한다.
emotionCommentsArrayList는 ArrayList<Hashmap<String, String>> 형태의 arraylist이다.
그럼 나는 여기서 comments, sympathCount, antipathyCount, usrName이 필요하고, 이것을 xml에 표현되게 하고싶어서 리소스를 맵핑시켜주고싶다!
그렇다면 다음과 같이 xml에 선언된 id값을 가져와주도록 하자.
int id = getResources().getIdentifier("negBestCommId" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int con = getResources().getIdentifier("negBestCommCon" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int like = getResources().getIdentifier("negBestCommLike" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
int dislike = getResources().getIdentifier("negBestCommDisLike" + (i - (i - negIdCnt)), "id", getActivity().getPackageName());
이게 이름이 id, con, like, dislike 라 그렇지, 다 xml에 있는 id값들이 int형으로 들어간거라고 생각하면된다.
그러니까, 간단하게 표현하면
for(int i = 0 ; i < emotionCommentsArraylist.size() ; i++)
int id = getResources().getIdentifier("negBestCommId" + i, "id", getActivity().getPackageName());
이 작업을 하고있는거다. 내가 필요해서 i부분을 좀 복잡하게 써놨는데, 아무튼 negBestCommId1,2,3,4,5 를 가져오겠다는 부분으로 이해하면된다.
참고로, 사용법은 아래와 같다.
//getResources().getIdentifier("가져올 ID" + i(숫자), "id", "패키지이름");
//액티비티에서 사용할 때
getResources().getIdentifier("negBestCommId" + i, "id", this.getPackageName());
//프래그먼트에서 사용할 때
getResources().getIdentifier("negBestCommId" + i, "id", getActivity().getPackageName());
그다음, 이렇게 얻어온 id를 TextView 타입의 배열에 넣어주도록 한다.
commId[i] = view.findViewById(id);
commCon[i] = view.findViewById(con);
commLike[i] = view.findViewById(like);
commDislike[i] = view.findViewById(dislike);
그리고 나는 이 TextView 배열의 i번째 인덱스에 setting 해주고싶다! 그러면
commId[i].setText(usrName);
commCon[i].setText(comments);
commLike[i].setText(sympathyCount);
commDislike[i].setText(antipathyCount);
요런식으로 해주면된다!
그러면 진짜 셋팅이 됨!
생각보다 참 쉽쥬?
결과
이거는 딱히 결과랄게 없다.. 뭐라고 설명해줘야되지..
혹시 궁금하시면 댓글 고고 아는대로 알려두림!
구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡
'Android, IOS > Android' 카테고리의 다른 글
[에러] android.support와 androidx 에러날 때 (0) | 2019.12.14 |
---|---|
[Android] RecyclerView 기본 사용법 (0) | 2019.12.14 |
[Android Sutdio를 활용한 안드로이드 프로그래밍 개정 5판] 연습문제 9장 6번 (18) | 2019.12.07 |
[에러] all com.android.support libraries must use the exact same version specification (0) | 2019.11.30 |
[Android Sutdio를 활용한 안드로이드 프로그래밍 개정 5판] 직접 풀어보기 8-2 및 응용 (0) | 2019.11.23 |