마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

xml 방식으로 api 사용시 질문입니다

0 추천

도시이름으로 검색을 해서 해당 도시의 값만 받아오기

사망자,확진자수--정렬순서를 바꾸기 ex.기준일시가 맨위에 오도록

 

이 두가지를 구현하고 싶은데 제가 한걸로는 검색버튼만 눌러도 해당 url로 인하여 모든 도시의 정보들을 불러옵니다

제가 위에 처럼 원하는 대로 하려면 전체를 받아와서 해당 값만 보여주도록 해야하는데 필터링같은 것들을 주제로 검색을 여러번 해봤는데 제가 원하는 결과가 나오질 않아서 질문합니다 혹시 어떤식으로 해야 원하는 도시의 값만 보여주는게 가능할까요?

당당 (810 포인트) 님이 2020년 12월 28일 질문

1개의 답변

0 추천
음.. 시행착오가 상당히 많이 된 느낌이네요.
전에 retrofit으로 하라는 이야기가

xml을 가져와서 --> 배열로 자동으로 만들어 주기 때문입니다.

그래서 배열로 리싸이클러 뷰에 넣으면 자동으로 뿌려줍니다.

필터링은 예를들어 배열이 1000개가 있는데,
그중 마포구가 10개라면..
배열을 루프를 돌아서 990개를 지우고, 10개만 남긴 다음에 리사이클러뷰에 넣는 겁니다.

그런 작업을 리사이클러뷰의 어댑터 안에서 하면, 코드는 똑같지만, 동작이 어댑터에서 하기 때문에 깔끔합니다.

소팅도 마찬가지입니다. 날짜순으로 소팅하려면 배열을  날짜순으로 소팅해서
다시 리사이클러뷰를 다시 그리는 겁니다.
그것도 리사이크러뷰에 매핑된 어댑터 내에서 할 수 있습니다.

당당님의 코드는 그러한 구조를 완전히 벗어났습니다.
해결책 두개중에 선택하셔야 합니다.

해결책 1: 구조를 정확하게 이해하려면,
1. 리트로핏으로 xml을 받아서 객체의 배열로 만드는 간단한 샘플
2. 객체의 배열을 리사이클러뷰로 매핑하는 간단한 샘플
3. 리사이클러뷰에서 필터링하는 간단한 샘플

상기 세가지를 완전히 이해한 후에 연결을 해야 하는 겁니다.

이 부분을 완전히 이해하는 것이 시간이 걸릴 수도 있습니다. 시간이 부족하다면, 포기하시는게 맞을 것같고요.

해결책2: 지금 파싱한 데이터를 StringBuffer에 넣지 말고,
객체배열을 생성해서 넣습니다.

그리고 위의 2-3번을 공부해서 하거나

아니면 지금 구조를 그대로 가져가려면
객체 배열에 넣고 소팅하거나 필터링해서
루프를 돌아 출력을 다시하는 겁니다.

소팅이나 필터링을 하려면, 결국에 객체 배열을 구성해서 하셔야 하므로, 그 부분은 파악이 되어야 합니다.

객체 배열을 생성하려면, 아래처럼 클래스를 만들고,

public class SidoItem {
    public String createDt;
    public String deathCnt;
    public String defCnt;
    public String gubun;
    public String gubunCn;
    public String gubunEn;
    public String incDec;
    public String isolClearCnt;
    public String isolIngCnt;
    public String localOccCnt;
    public String overFlowCnt;
    public String qurRate;
    public String seq;
    public String stdDay;
    public String updateDt;

}

객체의 배열을 생성한 후에
public List<SidoItem> list = new List<>();

아이템을 하나 생성해서
파싱한 데이터로 루프를 돌아
FOR:
  SidoItem item = new SidoItem();
  item.gubun = 파싱한 구분값..
  ...
  
  list.add(item)

이렇게 해서 넣고

원래 list를 가지고 있고,
필터링list를 하나 생성해서
gubun에 입력된 지역명이 있으면,
필터링list로 add해서
최종 필터링list만 출력하는 겁니다. (쉬운 겁니다. 결국)

소트는 배열을 소트하려면.. 아래 코드 같은 겁니다.
날짜를 문자열로 받았다고 가정하면, 아래같이 하면 stdDay 순으로 소팅이 됩니다.

Collections.sort(list, new Comparator<SidoItem>() {
                @Override
                public int compare(SidoItem o1, SidoItem o2) {
                    return o1.stdDay.compareTo(o2.stdDay);
                }
            });

소팅을 한 뒤에 다시 출력하는 겁니다.

이런식입니다.
이런 것이, retrofit으로 하면, 루프를 돌면서 배열 객체에 넣을 필요가 없는 것이고,
리사이클러뷰에 필터링을 적용하면, 어댑터안에서 저런 배열을 처리해서 최종 배열을 넘겨서 다시 그리는 겁니다.

아무튼 방식은 그렇습니다.
어떤 방식으로 할 지는 판단하셔서 진행하시면 됩니다.

급할 수록 천천히 가야 더 빨리 많이 늘게됩니다.
바로 결과코드를 만들지 말고, 중간중간 테스트 코드를 만들어서, 적용한 뒤에 실제 코드로 들어가는게 시행착오를 줄이게 됩니다.

길게 이야기 할 수 밖에 없어서 안타깝네요.
Will Kim (43,170 포인트) 님이 2020년 12월 28일 답변
...