메모리 손실을 막기 위해 리스트뷰에서 스크롤 할 때마다 겟뷰가 호출되어..
체크박스 등을 사용할 때 포지션이나 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ㄱ같은 경우엔 어떻게 해야 할지 모르겠습니다....
위 상황에서 어떻게 로직을 짜야할지..한마디의 조언이라도 부탁드립니다..긴글 읽어주셔서 감사합니다.