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

getView 재사용 문제 조언 부탁드립니다.

0 추천
@Override
public View getView(final int position, View convertView, ViewGroup parent) 
{
	
	View v = convertView;
			
	if(v==null)
	{
		v=getActivity().getLayoutInflater().inflate(R.layout.msg_listview, null);
		
	}
	else //null이 아닐 때 즉, 스크롤 할 때 ..
	{
		Log.d("v!=null","not null");
	}
		
	msg_edit = (EditText)v.findViewById(R.id.msg_edit);
	msg_radio = (RadioButton)v.findViewById(R.id.msg_radio);

	Log.d("재사용 후, 포지션 값 변화","position: "+position);
//	editsPosition = (Integer)v.getTag();
	msg_edit.addTextChangedListener(new TextWatcher() 
	{
				
		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) 
		{
					
		}
				
		@Override
		public void beforeTextChanged(CharSequence s, int start, int count,
		int after) {
					
		}
		@Override
		public void afterTextChanged(Editable s) 
		{
					
		//입력 후
		Log.d("현재 editText 포지션은?",Integer.toString(position));
					
						
					if(position==position)
					{
						String text = msg_edit.getText().toString();
						if(!text.equals(""))
						{
						Log.d("입력한 text: ",text);
						}
						SharedPreferences.Editor editor = pref.edit();
						editor.putInt("array_size", editArray.length);
						for(int i=0;i<editArray.length; i++)
						{
							editor.putString("array_"+i, editArray[i]); //저장
						}
						editor.commit();
					}//if
				}
			});

 

위와 같은 식으로, editText를 넣은 리스트뷰를 구성하였습니다.

현재 문제가, 스크롤 등으로 getview호출이 되고나면, editText의 포지션이 꼬이면서 입력한 값이

여러 번 보이는 중복 현상이 발생합니다.

현재 리스트는 총 50개인데, 한 페이지에 5개씩 보여줍니다. 

즉, 재사용 문제로 0번 editText에  입력한 텍스트 값이, 6번 editText에도 출력이 됩니다..

getview convertView가 null이 아닐 때, 포지션 값을 잘 활용하라는데 당최 어떻게 해야 할지 모르겠습니다.

최종적으론 입력한 텍스트를 저장하고, 출력해서[setText] 보여주려고 하는데, 

재사용이 되다보니 엄청나게 중복이 되네요.... 조언 좀 부탁드립니다....

 

+프래그먼트를 상속받는 클래스라 viewholder도 사용이 안됩니다..

anci (19,950 포인트) 님이 2015년 1월 21일 질문
anci님이 2015년 1월 21일 수정

2개의 답변

0 추천
익명사용자 님이 2015년 1월 21일 답변
0 추천
비슷한 경우로 리스트뷰에 체크박스가 들어 있을 때,

getView 호출 시 view 재사용에 대한 문제를 경험했습니다.

(스크롤 하면 체크 표시가 엉뚱한  row 에서 표시되는 등)

단순한 해결책으로 HashMap 을 하나 멤버 변수로 선언하여

position 을 키로 하여 체크 여부를 저장하고

getView 호출 시 position 을 키 값으로 HashMap 에서 불러와서

체크박스에 표시해 주었습니다.

같은 방법으로 EditText 의 문자열 값을 저장하고 불러오면 되지 않을까 합니다.
가랑비 (10,530 포인트) 님이 2015년 1월 21일 답변
...