2014년 5월 11일 일요일

[ Android ] ListView 사용 방법 및 커스텀

이번 튜토리얼은 ListView의 기본적인 사용 방법과 커스텀 방법에 대해 알아보겠습니다.

1. xml 수정하기
 ListView가 보여질 레이아웃의 xml에 ListView 위젯을 추가 합니다.


2. ListView 및 Adapter 설정
 어댑터를 생성하고 xml에 추가한 Listview에 어댑터를 연결하여 ListView가 동작 되도록 해보겠습니다.


여기 까지는 기본적인 리스트 뷰 사용방법 입니다.

이제 커스텀 하는 방법을 알아보도록 하겠습니다.



3. ListView에 출력 될 레이아웃 만들기
 원하는 모양의 아이템을 출력하기 위해서 새로운 xml파일을 생성하여 출력 될 모양을 만들어야 합니다.

여기서는 텍스트와 버튼이 출력 되도록 만들어 보겠습니다.

custom_item.xml 파일


4. 커스텀 어댑터 생성
 CustomAdapter 클래스를 생성하고 BaseAdapter 클래스를 상속 받습니다.
문자열을 보관 하기 위해 ArrayList<String> 를 사용하며, String 대신에 직접 만든 클래스를 추가하면 더욱 많은 정보를 가진 커스텀 아이템을 제작 할 수 있습니다.


5. ListView 및 Adapter 설정
 위 2번에서 했던 작업 입니다. 2번 소스와 비교해 보시면 어댑터 부분이 변경 된 것을 확인 하실 수 있습니다.

여기 까지 제작 하고 실행을 하면 각종 이벤트가 정상 작동 하는 것을 확인 하실 수 있습니다.

하지만, 어댑터에 아이템을 더 추가하여 스크롤이 되게 만들면 아이템 위치가 변경되 출력 되는게 보이실 겁니다.


6. Holder를 추가하여 데이터 변형 방지
 새로운 클래스를 하나 생성하여 getView()에서 홀더를 사용하면 스크롤 시 데이터가 변경 되는 것과 findViewById()를 사용을 줄여 향상 된 속도를 얻을 수 있습니다.

변경 된 부분의 소스는 아래와 같습니다.

 CustomHolder 라는 클래스가 하나 추가 되었으며 이 클래스는 아이템이 갖고 있는 요소를 저장 할 수 있도록 TextView와 Button을 갖고 있습니다.
그리고 getView() 함수에서는 convertView가 null 일 때 holder를 생성하여 holder에 TextView와 Button을 넣고 해당 View의 Tag로 지정을 합니다. 만약 convertView가 null이 아니라면 Tag를 가져와 저장해 놓았던 TextView와 Button을 빼내 나머지 처리를 하게 됩니다.

이상으로 ListView 사용 방법과 커스텀에 대한 튜토리얼을 마치도록 하겠습니다.



댓글 18개:

  1. 정말 감사합니다... ㅎㄷㄷ

    답글삭제
  2. CustomAdapter.java 파일에서
    text.setText(m_List.get(position));
    부분에 setText에 에러가 나는데 어떻게 할지 모르게씁니다ㅠㅜ

    답글삭제
    답글
    1. 소스를 변경하셨다면 text의 타입이 TextView가 맞는지 확인이 필요할 것 같습니다.

      삭제
  3. if ( convertView == null )
    이 구문 때문에 리스트뷰가 길어질 때엔 스크롤을 해버리면 리스트의 순서가 뒤죽박죽 되던데요.
    혹시 왜 저 구문을 넣었는지 알 수가 있을까요?

    답글삭제
    답글
    1. 6번 Holder를 사용하셔야 스크롤 시 일관된 데이터를 출력 할 수 있습니다.

      삭제
  4. 만약에 커스텀리스트뷰에서 버튼대신 라디오버튼을 사용할려면 어떻게하나요??
    그리고 버튼이 텍스트뷰의 왼쪽에 오게할려면 어떻게해야하나요?
    저기 custom_item.xml에서 textview와 button의 위치를 서로 바꾸면 계속 ClassCastException이뜹니다. ㅠㅠ

    답글삭제
    답글
    1. 라디오버튼을 사용해보지는 않았습니다만 기존에 사용하던 방법 그대로 넣어주시면 무리없이 사용이 가능할것같구요.
      TextView와 Button위치를 변경했을때 이유없이 에러가 날 경우에는 프로젝트를 Clean해 주시고 다시 빌드 후 실행하시면 정상 작동합니다.

      삭제
  5. 메인액티비티에서 액티비티를 호출하여 커스텀 리스트 뷰를 사용하다 한 로우를 선택한 후 다시 메인으로 돌아오면 리스트뷰에 추가가 안되는데 혹 이런 문제를 어떻게 해결할 수 있을까요?

    답글삭제
  6. onCreate에서 값을 추가하는것 말고, 다른 함수에서 값을 추가할때는 섹션이 나뉜걸 어떻게 적용하면 될까요?

    답글삭제
  7. 버튼 대신 이미지를 넣고 싶은데 버튼위젯 대신 이미지뷰를 사용하면 될까요??ㅠㅠ 어떻게 적용하면 좋을까요?ㅠㅠㅠ

    답글삭제
    답글
    1. 작성자가 댓글을 삭제했습니다.

      삭제
    2. imagebutton을 사용하시면 될 것 같습니다.

      삭제
  8. 작성자가 댓글을 삭제했습니다.

    답글삭제
  9. CustomAdapter클래스에서 ArrayList형식이 java.lang에 있는 String 형식이 맞나요?
    자꾸 NullpointerException이 나서 어디서 잘못됐는지 잘모르겠습니다.

    답글삭제
  10. 커스텀에서 저 텍스트 옆에 또 하나의 텍스트를 넣으려 한다면 어떻게 해야 할까요?

    답글삭제
  11. 그대로 복사 붙여넣기 했는데 왜 안되는거죠;; 제 나름대로소스 참고해서 만들다가 왜 안되는지 확인하다가 그냥 아예 복사 붙여넣기 했는데 안되네요. 그래서 디버깅 했는데 .setAdapter() 여기서 에러 나오네요 디자인단 문젠가? 어댑터소스 문제인가..

    답글삭제
    답글
    1. 5번까지 작업했는데 에러 나왔습니다. 능력이 부족해서 그런건지;; 에러 원인 찾다가 못찾아서... 소스 똑같이 적용 했는데.. 안되는건 뭔지 모르겠네요.

      삭제
  12. 오탈자가 있어서 조금 고쳐야 될것 같은데...

    답글삭제

Post List