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

커스텀리스트뷰 드래그/드롭시 view가 변하지 않습니다.[추가]

0 추천

질문글이 길어져서 간략하게 여쭤봅니다.

구글링해서 얻은 샘플 소스로 리스트뷰 드래그/드롭을 이용해서 커스텀 리스트뷰를 만들어

드래그 드롭하고자 합니다. [순서바꾸기]

기존 소스에서는 간단히 textview로, string array 내용을 출력한 후, 그 row들을 드래그/드롭해서

순번을 바꾸는 것이었는데,

저같은 경우엔 커스텀 리스트뷰로 수정해서, 안에 textview,radiobutton등 레이아웃을 바꿧습니다.

if (convertView == null) 
			{
				//holder = new ViewHolder();
				// 타입에 따라 각기 다른 XML 리소스로 뷰를 생성한다.
				//holder = new ViewHolder();
				switch (type) 
				{
				
				case 0:
					//view = m_inflater.inflate(R.layout.customview, null);
					view = m_inflater.inflate(R.layout.model_listview1, parent,false);
					break;
				case 1:
					view = m_inflater.inflate(R.layout.model_listview2, null);
					//view = m_inflater.inflate(R.layout.model_listview1, parent,false);
					//EditText tv_name1 = (EditText)view.findViewById(R.id.et1);
					//tv_name1.setVisibility(view.INVISIBLE);
					break;
				
				}



getview내에서 convertview==null일시, view를 추가할 때, arraylist내용을 읽어와서

인자가 0이면 layout1을 view로 추가, 1이면 layout2를 추가하도록 해서

같은 디자인의 row가 아니라 제가 원하는 두가지의 레이아웃을 마음대로 배치하도록 만들었습니다.

layout1 row

layout2 row

layout2 row 이런식으로.

문제는, 이렇게 커스텀리스트뷰로 수정하고나서 드래그/드롭을 하면 중간에 view[row가 있어야할곳]가

비어버리거나, 바꾸어도 row 순서가 변하지 않습니다.

arraylist에 수정된 내용은 정상적이네요.(즉, view 갱신이 되지 않거나 invisivible되어버림)

커스텀뷰로 바꾸면서 view가 꼬여서 그런걸까요? 소스가 길어서 첨부하지 못합니다..ㅠㅠ

혹시 이런 비슷한 현상을 겪었던 분들이 계신지요?

+

드래그,드롭을 하다가 신기한 패턴을 발견했는데..
뷰타입이 같은 녀석들끼리 붙어있을 때는 이상이 없습니다.

뷰타입이 다른 row를 드래그해서 접촉시킬 때 문제가 발생하네요.

즉,,

layout1

layout1 

이 상태에선 드래그를 해도 invisible같은 현상은 발생하지 않는데..

layout1

layout2

 상태에선 문제가 발생합니다. 이 상태에서 row1/2의 순번을 바꾸면 

layout2

layout1[invisible상태] 가 되어버리구요,

여기서 layout1을 추가 시켜서 

layout2

layout1

layout1 상태로 만든다음, 새로 추가한 이녀석을 위로 드래그하면 invisible되었던 

두번째의 layout1이 다시 visible하면서 세번째로 드래그.드랍이 되네요.

망고사탕 (5,000 포인트) 님이 2016년 6월 6일 질문
망고사탕님이 2016년 6월 7일 수정

1개의 답변

0 추천
aucd29 (218,390 포인트) 님이 2016년 6월 7일 답변
aucd29님 답변 감사합니다.getViewTypeCount는 이미 2로 설정했습니다.(return 2)
+
@Override
        public int getItemViewType(int position) {
            return data_list.get(position).type;
        }
getItemViewType은 이렇게 했습니다..(type의 변수에 따라 convetview다름)
이 상태에선 드래그를 해도 invisible같은 현상은 발생하지 않는데..
layout1
layout2
 상태에선 문제가 발생합니다. 이 상태에서 row1/2의 순번을 바꾸면

==> 바꾸는 이벤트때 data_list 데이터도 swap 시키신거 맞나요?
aucd29//답변감사합니다.
아직 listview 애니메이션,스왑쪽은 소스 분석 중인데, 기존소스를 건드리지 않고
메인쪽만 customlistview로 바꿨을 뿐인데 에러가 발생하네요. 분명 제가 수정해야할 부분이 있는데, 그대로 사용해서 에러가 발생한 것 같습니다.
뷰가 심하게 오락가락하는데, 뷰갱신이 안되고, arraylist내용만 스왑되는 것 같습니다. arraylist(data_list)는 드래그/드롭하고나서 뷰가 비정상적으로 나와도 로그캣으로 확인해보면 순번이바뀌어있습니다.
swapElements(mModelData, originalItem,getPositionForView(switchView));
private void swapElements(ArrayList arrayList, int indexOne, int indexTwo)
    {
        Object temp = arrayList.get(indexOne);
        arrayList.set(indexOne, arrayList.get(indexTwo));
        arrayList.set(indexTwo, temp);
    }
이 부분이 실질적으로 데이터가 바뀌는 부분인것 같습니다.
재차 질문드려 죄송하지만.. 데이터가 바뀐 뒤로, view가 안바뀌는건 ..
제가 그 외에 무슨 기능을 추가해야하는 건가요? getview내에 아직 저렇게 밖에 소스를 짜지 못했습니다.
data 가 변경된 이후 해당 adapter 에 notifyDataSetChanged 만 호출해 줘도 알아서 변경될 거 같습니다. 물론 view 에 추가적인 변경이 존재하면 그에 대한 부분도 getView 내에서 처리해줘야 하겠지만요

일단 swapElements 이후에 adapter.notifyDataSetChanged 이 호출되고 있는지 확인해보세요
...