앱툴즈
46.♡.168.138
46.♡.168.129
46.♡.168.161
46.♡.168.136
46.♡.168.145
46.♡.168.162
46.♡.168.144
46.♡.168.140
115.♡.135.198
46.♡.168.139
 
게시물 88건
   
확장리스트가 3뎁스 이상이 될까? 안될까?
글쓴이 : 김병주                   날짜 : 2012-08-21 (화) 00:13 조회 : 6505
리스트를 구현하다보면 간혹 확장가능한 리스트를 사용하는 경우가 있습니다.
 
먼저 우리가 가장 흔히 사용하는 ListView의 경우를 볼까요?
 
ListView는 주로 어떤 목록의 1뎁스를 보여주고자 할때 사용 됩니다.
 
ListView를 사용하시다보면 여러가지 setOn 인터페이스를 사용하실 껍니다.
 
Index라던지 등등 겹쳐서 사용하다보면 가끔 setOnItemClickListener가 안먹죠.
 
왜그럴까요?
 
ListView에는 focus가 기본으로 지정되어 있습니다.
 
(뷰에서 자동으로 포커스가 지정되는지 확인하기 위해서는 avd에서 방향키를 아래나 위로 움직여 ㅁ모양의 테두리가 생긴다면 포커스가 있는것입니다.)
 
ListView에 여러가지 이벤트인터페이스를 넣어둔다면, ListView는 focus를 찾기 위해
 
각 인터페이스의 리턴값을 물어봅니다. false 인지 true인지.
 
눈치 채셨으려나 모르겠지만. 인터페이스 중에 리턴값이 없이 void를 갖는 인터페이스가 있죠.
 
setOnItemClickListener입니다.
 
그냥 클릭리스너도 마찬가지겠죠.
 
이 리스너는 만약 위와 같이 ListView가 적당한 focus를 찾지 못해 이벤트 리스너의 리턴값을
 
물어보는 상황이 되면 리턴 값이 없는 이벤트 리스너는 focus를 찾지 못하기 때문에 작동하지
 
못합니다.
 
이를 방지 하기 위해 어뎁터에서 onTouch이벤트로 position 값을 가져오던가 하는 방식으로
 
인덱스를 가져와 activity내에서 처리하는 방식이 있습니다.
 
(어뎁터에서 포지션 가져오는 소스는
//이클립스끄고 하는거라 오버라이딩 메소드이름을 까먹었습니다. ;;
어뎁터 상단은 평소사용하던 baseadapter가 아닌.
extends ArrayAdapter<String>{ 이렇게 써줍시다. 그래야 포지션값받아올수 있어요.
 
//이건 리스트뷰를 set해주는겁니다.
public ListView getListView()
 {
  return this.list;
 }
 
public onTouch touch = new onTouch()
{
   ListView list = getListView();
@Ovrride
 public boolean onTouch? 맞나...(View v, MotionEvent event)
{
  if(event.getAction() == MotionEvent.ACTION_DOWN)
 {
    int position = list.getPositionForView(v);
 }
return false;
}
이런식으로 하시면 setonitemclick의 파라메터중 포지션값을 얻어와 처리할 수 있습니다.
 
 
}
 
자 그럼 이걸 왜 설명하였느냐?
 
 기본적으로 확장리스트는 두개의 리스트를 사용합니다.
 
메인이 되는 상위 group의 리스트와 그 group의 하나하나의 객체에 속해있는
 
child 리스트죠.
 
여기서 중요한건 확장리스트를 사용하면 확장리스트는 자동으로 포커스관리를 해준다는겁니다.
 
단, 두개의 리스트에 한해서만요.
 
확장리스트는 group에 속한 child 리스트들을 평소에 gone상태로 두었다가 클릭시
 
visiable상태로 바꾸어 보여주는 형식입니다. 이때 focus는 아직 group이 가지고 있습니다.
 
하지만 child를 선택하는 순간 focus는 group false child는 true가 됩니다.
 
이걸 자동으로 해주죠.
 
그럼 3뎁스를 구현이 가능한가?(리스트를 또추가해서)
 
해봤는데 되긴 됩니다.
 
단, 포커스 컨트롤이 상당히 힘들고, 어뎁터 내에서 해당 리스트를 다른 어뎁터를 또 써서
 
그 어뎁터에서 리스트를 구현해야됩니다. (child 리스트의 내용이 들어가는 row부분의 layout에
 
리스트를 추가하시고 인플레이터시키시면 됩니다.)
 
문제는 이렇게 구현하게 되면, child는 다시 group이 되는거고 추가된 3뎁스의 리스트는
 
child가 되야 정상적으로 작동하겠죠.
 
눈치 채신분이 있겠지만 네..
 
child자체를 다시 확장리스트로 만듭니다.
 
그럼 chlidgetView에서 다시한번 확장리스트를 구현하는 방식이 되겠죠.
 
그럼 위에서 말한 focus는 누가 우선순위로 점유하느냐?
 
답은 가장 마지막에 열린 View가 focus를 점유하게 됩니다.
 
때문에 만약 확장리스트로 3뎁스이상을 구현하게 되면
 
확장리스트의 확장리스트방식으로 구현하시면 됩니다.
 
그림으로 보시면
 
[ group  [   child    group=child  ]]   [   child   ]]....
 
이런방식으로 됩니다.
 
child = group이 되고 다시 group의 child가 생성되는거죠.
 
괄호를 색으로 구분지어두는게 더 이해하기 편할거 같아서 저리 해두었습니다.
 
보시면 아시겠지만 2차 group까지는 빨간색의 group이 focus를 통제하고 그 아래 child는
 
파란색의 group이 통제하게 됩니다.
 
이런식으로 구성하면 3뎁스가아니라 힙메모리가 버티는한은 계속 생성이 가능하겟죠.
 
단. 제가 이런방식으로 3뎁스까지만 해보았고, 그 이상은 안해봤습니다.
 
저한텐 3뎁스만 있으면 됬거든요 ㅎ;
 
여튼 저렇게 되면 adapter는 리스트의 개수에 따라 증가하게 될꺼니까
 
뎁스 count  * 2 하시면 될거 같습니다.
 
 
(아 추가로 Api 데모에 collapsed 라는게 있는데, 이런방식으로 구현하면
리스트가 포커스를 찾지못해 망합니다. 다중확장리스트 구현시에는 사용하지 마세요.)
* 글을 등록하실때 꼭 필요한 경우가 아니면 개인정보를 남기지 마세요 ^^ (연락처,이메일주소,주민등록번호 등)




김병주 님의 Tip&Tech 최신글 [더보기]


 
정흥진 2012-08-29 (수) 09:42
아~~~~ 이거였군요!! 마침 궁금했었는데 정말 감사합니다!! (__)넙죽
   

게시물 88건
번호 제목 글쓴이 날짜 조회
88  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 참석 요청 준모 11-30 2550
87  <클라우드혁신센터> 12월 1일 SW 스타트업 창업 성공 전략 세미나 준모 11-23 2483
86  개인개발자 SW개발환경 지원사업 안내 준모 10-28 2682
85  맥에서 구글 API key 등록방법 성기동 08-29 3575
84  [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 씨트린개발… 07-21 6325
83     [Agate Mobile] 앱 설치 없이 서버로부터 실시간 로딩 되어 동작하는 Cloud Native App 프레임워크입니다. 김은호 08-21 10877
82  자바 초보들에게 추천하는 기초 개념을 잡을 수 있는 책들 이경용 06-19 4719
81  [팁] 갤럭시 노트3 개발자 옵션 메뉴 찾기 ^^ 이경용 11-09 8628
80  앱템플릿을 제공하는 사이트 소개합니다. 씨트린개발… 08-21 11228
79  The content of the adapter has changed but ListView ... 에러 일반적 해결법. 김병주 04-16 14275
78  간단하게 패스워드에 숫자가 혼용되었는지 처리할 수 있는 메소드입니다. 김병주 01-31 5350
77  handler를 이용해 가변시간 반복 작업하기. 김병주 11-26 7257
76  String -> HEX 김병주 11-12 4639
75  리스트 작업시에 기본적으로 알아두셔야 될점. +1 김병주 10-08 5718
74  xml 직렬처리 고범석 09-24 3760
73  주소록 추가/삭제 감지해서 앱의 db추가/삭제하기. 김병주 09-24 11329
72  확장리스트가 3뎁스 이상이 될까? 안될까? +1 김병주 08-21 6506
71  ZXing 바코드 스캔부분 크기 조절하기. 김병주 08-06 13374
70  이클립스에서 레이아웃 xml 그래픽부분이 갑자기 안보일경우. +1 김병주 07-27 5330
69  간만에 글쓰네요 이번엔 launcherShortCut (바로가기 아이콘)입니다. 김병주 07-25 10896
 1  2  3  4  5  
 
 
 
Copyright ⓒ wwwold.androidstudy.co.kr. All rights reserved.