Android, IOS/Android

[Android] for문으로 여러개의 리소스 읽어오기 (feat. getIdentifier, arraylist<hashmap>)

Emil :) 2020. 11. 23. 17:46
728x90
반응형
이 글은 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

 

OKKY | 안드로이드 for문으로 변수 값 넣어주기 관련 질문입니다.

안녕하세요, 다음과 같이 선언되있는 UI에 for문으로 데이터를 집어넣고 싶습니다. ImageView simArticleImg1 view.findViewById(R.id. simArticleImg1 ) ; TextView simArticleTitle1 view.findViewById(R.id. simArticleTitle1 ) ; Tex

okky.kr

간단하게 사용법만 알고싶다면 아래 블로그를 참조하자

ldelight.tistory.com/22

 

[Android] 문자열로 Resource 가져오기

문자열로 해당 Resource (혹은 레이아웃에 포함된 View) 의 ID 값을 가져온다; ----------------------------------------------------------------- getResources().getIdentifier(파일명, 디렉토리명, 패키지명..

ldelight.tistory.com

진행 과정


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);

요런식으로 해주면된다!
그러면 진짜 셋팅이 됨!

생각보다 참 쉽쥬?

결과


이거는 딱히 결과랄게 없다.. 뭐라고 설명해줘야되지..
혹시 궁금하시면 댓글 고고 아는대로 알려두림!

구독 및 하트는 정보 포스팅 제작에 큰 힘이됩니다♡

728x90
반응형