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

getview가 새로 호출될 때 어떻게 처리 해야 할까요..

0 추천

메모리 손실을 막기 위해 리스트뷰에서 스크롤 할 때마다 겟뷰가 호출되어..

체크박스 등을 사용할 때 포지션이나 ui가 섞여 혼선이 올 수있다는 글을 보았습니다.

현재 리스트뷰에 총 50개의 editText가 있는데요..추가나 삭제 없이 이 값 가지고만 처리합니다.

즉, 50개의 editText에 각각 제가 원하는 스트링 값을 입력하고, 옆에 있는 저장버튼을 누르면 저장되어서, 

언제든지 사용할 수있도록 구현하고자 합니다. 현재 저장 이전에, editText가 꼬여서 골머리를 앓고 있습니다.

이해력이 낮은건지 2일이나 붙잡고 있습니다.

 

@Override
		public View getView(final int position, View convertView,ViewGroup parent) 
		{
			final ViewHolder holder;
			View v = convertView;
		
			if (v == null) 
			{
				holder = new ViewHolder();
				v = getActivity().getLayoutInflater().inflate(R.layout.msg_listview, null);
				holder.msg_edit = (EditText) v.findViewById(R.id.msg_edit);
				v.setTag(holder);
				holder.msg_edit.setText(myItems.get(position).caption);
			} 
			else // null이 아닐 때 저장된 뷰 홀더를 사용.
			{
				holder = (ViewHolder) convertView.getTag();
			}
			holder.msg_edit.setText(myItems.get(position).caption);
			holder.msg_edit.setId(position);
			msg_savebtn = (Button) v.findViewById(R.id.msg_savebtn);//edit저장버튼
			msg_savebtn.setTag(position);
			msg_savebtn.setOnClickListener(new View.OnClickListener() 
			{
				
				@Override
				public void onClick(View v) {
					// TODO Auto-generated method stub
					int savebtnpos = (Integer) v.getTag();
					Log.d("savebtn position",Integer.toString(savebtnpos));
					String whatisedit = holder.msg_edit.getText().toString();
					Toast.makeText(getActivity(), Integer.toString(savebtnpos)+"번 버튼 : "
					+whatisedit, 1000).show();
				}
			});
			
			return v;
		} // getview

 

뷰홀더를 이용하면, getview에서 재사용되는 문제를 막을 수 있다고 했는데요.

뷰홀더 클래스에는 msg_edit 요 녀석 하나만 추가해뒀습니다.

public class ViewHolder
{
  public EditText msg_edit;
}
이렇게요.
 
 
위의 소스를 보면..
holder.msg_edit.setText(myItems.get(position).caption); 에서 setText를 해줍니다.
이게 전체 리스트 사이즈만큼의 0~49의 숫자를 caption이라는 단어 뒤에 붙여서 editText에 출력해줍니다.
지금 보면 0~49개의 editText에 caption0~49가 setText 되어 있습니다.
현재 msg_savebtn은 저장기능은 없고, 버튼을 누를 경우, 그 버튼과 똑같은 position을 갖고있는 editText가 현재 갖고있는 값을 출력해줍니다. getText().tostring() 이런식으루요.
 
지금 상황에선 스크롤하면 제가 중간에 수정한 editText값은 다 사라지고 다시 caption0~49가 setText 됩니다.
당연히..지금 변화된 값을 저장하지 않았기에..그러겠지요.. 
v가 널이냐 아니냐 체크한 후 else문까지 빠져 나와, 바로 실행되는 코드가
holder.msg_edit.setText(myItems.get(position).caption); 이거니까요.
수많은 예제를 봐도 정말 이해할 수가 없습니다..ㅠㅠ..
만약 체크박스인 경우엔, 체크된 포지션 값을 저장했다가 그 위치에 해당하는 애만 뿌려주라는데..
editTextㄱ같은 경우엔 어떻게 해야 할지 모르겠습니다....
 
위 상황에서 어떻게 로직을 짜야할지..한마디의 조언이라도 부탁드립니다..긴글 읽어주셔서 감사합니다.
 
 
anci (19,950 포인트) 님이 2015년 1월 22일 질문

2개의 답변

0 추천
TextWatcher로 실시간 저장을 하세요
안티푸라면 (6,700 포인트) 님이 2015년 1월 22일 답변
말씀감사합니다..현재 textWatcher로 실시간 저장하기엔 문제가 좀 생겨서, 임시저장 버튼을 만든겁니다. 현재 제가 원하는 건 저장방식이 아니라 getview호출시, 재사용될 때 editText에 각 포지션에 제가 알맞게 입력한 것들이 뒤죽박죽 섞이지 않고 잘 나오는것입니다..ㅎㅎ
edittext 보여주기용도의 arraylist등을 만들어서 임시저장-사용하고 필요할때 db 등에 저장하면 되겠네요.
0 추천
안드로이드 listview가 하위 view를 어떻게 사용하는지에 대해 공부하시기 바랍니다.

ViewHolder 패턴을 사용한다고 재활용을 막는게 아닙니다.

공부하기 귀찮으시면 getView에서 항상 View를 새로 생성하게 수정하면 됩니다. (스크롤 속도는 느려질 겁니다.)
익명사용자 님이 2015년 1월 22일 답변
...