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

listview 드래그로 순서변경하는것

0 추천

안녕하세요 안드로이드 펍 가족님들..

리스트뷰에 있는 아이템을 드래그해서 순서바꾸려는것을 할려고하는데요..

인터넷에서 떠도는 소스를 붙여서했는데 오류가납니다.

http://mbsmin.tistory.com/14

널포인트인셉션인데 제가 잘못한건가요 아니면 소스가 원래잘못된건가요 ㅜㅜ

 

흠바바 1 (4,000 포인트) 님이 2013년 11월 18일 질문

2개의 답변

0 추천
복붙하지말고 소스 파악좀 합시다
건방진프로그래머 (26,630 포인트) 님이 2013년 11월 18일 답변
0 추천
http://egloos.zum.com/zerosum30/v/1188818

참조해서 attr.xml 사용법을 익히시고

attr.xml을 만들어 줍니다.

attr.xml에 해당 링크의 세번째 내용을 붙여넣어 줍니다.

  <declare-styleable name="TouchListView">
        <attr name="normal_height" format="dimension" />
        <attr name="expanded_height" format="dimension" />
        <attr name="grabber" format="reference" />
        <attr name="dragndrop_background" format="color" />
        <attr name="remove_mode">
            <enum name="none" value="-1" />
            <enum name="fling" value="0" />
            <enum name="slide" value="1" />
            <enum name="slideRight" value="1" />
            <enum name="slideLeft" value="2" />
        </attr>
    </declare-styleable>

그러면

grabberId = a.getResourceId(R.styleable.TouchListView_grabber, -1);

이부분에서 널 포인터가 나는데 이부분을 수정해야 합니다.

해당 리스트 뷰에서 grabber를 지정해주지 않았기 때문에 디폴트 값인 -1을 반환하였고

-1 메모리에 있는 자료를 참조하려 했으니 null 에러가 뜨는겁니다.

_grabber은

<attr name="grabber" format="reference" />

이므로 grabber의 항목은 사용하는 xml에서 정의해야 합니다.

사용할 list_view의 item 중, 드래그 할 경우 순서가 바뀔 아이템의 아이디를 넣어줍니다.

원래라면

<패키지 이름.TouchListView
                android:id="@+id/wish_list_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

에서 grabber의 아이디를 잡아줘야 하는데, 리스트 뷰와 리스트뷰의 내용물이 같은 xml에 존재하지 않아서 id를 주는 법을 모르겠네요.

그래서

grabberId = a.getResourceId(R.styleable.TouchListView_grabber, R.id.list_image);

의 디폴트 값을 수정합니다.

리스트 뷰의 내용물에 있는 R.id.list_image 아이디를 가진 뷰를 드래그 할 경우 순서가 바뀌도록 한 경우입니다.

그리고 아마 코드에서 insert를 새로 구현해야 할텐데

insert를 구현한 뒤에 notifyDataSetChanged()를 해주시면 됩니다.
마가 (590 포인트) 님이 2016년 2월 19일 답변
...