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

라디오버튼으로 리스트뷰 초기화 및 새로운 내용 채워넣으려 합니다.

0 추천

각 지역을 클릭할때마다 각 지역 특징을 묘사하는 짧을 글들의 리스트를 나타내려고 하는데요. 

잘 안되네요..ㅠ

이런식으로 scrollview로 왼쪽에 지역들을 표시해놨고

오른쪽 여백에는 listview로 해놨습니다.

 

해당 xml 코드와, 제가 시도한 자바 코드의 흔적입니다.. 글자제한때문에 xml은 안올리고 자바 캡처본만 올립니다..ㅡ-ㅡ

자바 코드는 모든 지역은 아직 안했고 위에 두개만 했는데 잘 안되네요. switch case문 이용했는데

default값에 넣은 건 잘 뜨는데, 라디오버튼 클릭해도 안바뀌고 그대로입니다.

androidandroid (120 포인트) 님이 2022년 12월 11일 질문

2개의 답변

0 추천

먼저 지역데이터를 준비하시고 라디오 버튼을 그려넣으세요.  지역데이터는 고정된 리스트이므로 enum을 사용하겠습니다.

public enum Sido {
    SEOUL("서울),
    ULSAN("울산"),
     ...
     JEJU("제주");

    private final String label;
    public Sido(String label) {
       this.label = label;
    }
  
   public String getLabel() {
       return this.label;
   }
}

 

라디오그룹에 시도 라디오 버튼을 생성합니다. 라디오버튼을 누를 때 리스트뷰에 필요한 시도데이터를 가져와서 보여주는 코드를구현하시면 됩니다. 동적으로 라디오버튼을 생성하지 않고 XML에 만들어질 걸 사용하시련 rG에서 라디오버튼을 찾아 View.OnClickListener를 설정하면 됩니다.

private sidoClickListener new View.OnClickListner() {
        @Override 
        public void onClick(View view) {
            Sido sido = sidoButtons.get(view);
            updateSidoDataBySido(sido); //구현
        }
 });

// 라디오버튼 동적생성
Map<Sido, View> sidoButtons = new HashMap<>();
for (Sido sido : Sido.values()) {
    RadioButton button = new RadioButton(rG.getContext());
    button.setText(sido.getLabel()):
    button.setOnClickListener(sidoClickListener);
    rG.addView(button); 
    sidoButtons.put(sido, button);
}


/* XML에 존재하는 라디오 버튼 찾기. 이 방법을 사용하면 sidoButtons를 매핑하는 방법이 바뀌야 겠죠.
for (int i = 0; i < rG.getChildCount(); i++) {
        View child = viewGroup.getChildAt(i);
        if (child instanceof RadioButton) {
               RadioButton button =  (RadioButton) child;
               button.setOnClickListener(sidoClickListener);
        }
    }
*/

 

updateSidioDataBySido 메소드를 구현합니다. 구체적인 코드는 님이 아실 것이므로 채워넣으시면 됩니다.

private void updateSidoDataBySido(Sido sido) {
       items = // TODO : 필요한 시도데이터를 가져온다.
       adapter.setItems(items); // setItems가 notifyDataSetChanges를 호출하도록 함.
}

 

 

 

 

 

spark (224,800 포인트) 님이 2022년 12월 11일 답변
spark님이 2022년 12월 11일 수정
0 추천
list 와 items 초기화 하는 위치랑 switch 문이 함께 있는 게 좀 수상해보이는데요,
rG의 'setOnCheckedChangeListener' 를 설정하셨는지 확인해보세요.
작성하신 switch 문은 라디오버튼 클릭할 때 동작할 내용이므로 각 object 초기화 코드랑 분리가 되어야 맞겠습니다.

또한 items 가 변경되었을 때 adapter 를 새로 생성하여 list 에 다시 설정하는 방식은 잘못되어 보입니다.
adapter 가 관리하는 items 가 변경된 것만 알려주어도 새로 그려질 것입니다.

아래 이미지 부분 초기화 하실 때 순서는 이런식이 될 것 같네요

list = findViewById(R.id.list);
items = new ArrayList<>();
items.add("지역을 선택해주세요");
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, items);
list.setAdapter(adapter);
rG.setOnCheckedChangeListener((_, checkedId) -> {
    switch(checkedId) {
     case R.id.seoul:
     items.clear();
     items.add("dd");
     items.add("dd");
     adapter.notifyDataSetChanged();
     break;

    case R.id.ulsan:
    items.clear();
    items.add("aa");
    items.add("aa");
    adapter.notifyDataSetChanged();
    break;

    default : // 조건에서 지정한 지역이 아닌 경우
    items.clear();
    items.add("지역을 선택해주세요");
    adapter.notifyDataSetChanged();
    break;
    }
}
익명 님이 2022년 12월 12일 답변
...