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

리스트뷰 indexoutofbounds 해결방법좀 알려주세요 ㅜㅜ

0 추천
public View getView(final int _position, View _convertView, ViewGroup _parent)
  {
   
   if(_convertView==null)
   {
    if(getItemViewType(_position)==0)  // 사진 래이아웃
    {
     // 레이아웃 생성
     _convertView=View.inflate(AddContactActivity.this, R.layout.add_contact_photoitem, null);
     _convertView.setTag(new MyTextWatcher(_position));     
    }
    else
    {
     _convertView=View.inflate(AddContactActivity.this, R.layout.add_contact_item, null);
     _convertView.setTag(new MyTextWatcher(_position));
    }
   }
   
   if(getItemViewType(_position)==0)  // 사진 래이아웃
   {    
    
    TextView p_tv = (TextView)_convertView.findViewById(R.id.p_textview);
    EditText p_et = (EditText)_convertView.findViewById(R.id.p_edittext);
    
    TextView p_tv1 = (TextView)_convertView.findViewById(R.id.p_textview1);
    EditText p_et1 = (EditText)_convertView.findViewById(R.id.p_edittext1);
       
    p_tv.setText(m_data.header.get(_position));
    p_tv1.setText(m_data.header.get(_position+1));
    
    MyTextWatcher tw = (MyTextWatcher) _convertView.getTag();
    tw.setPosition(_position);
    p_et.addTextChangedListener(tw);
    
    
    if(_position==HEADER_TYPE_PHONE)
    {
     p_et.setInputType(EditorInfo.TYPE_CLASS_PHONE);
    }
    else
    {
     p_et.setInputType(EditorInfo.TYPE_CLASS_TEXT);
    }
    if(m_data.val!=null)
    {
     p_et.setText(m_data.val.get(_position));
     p_et1.setText(m_data.val.get(_position+1));
     CLog.d("set text"+_position+" as "+m_data.val.get(_position));
    }
    
   }
   else
   {
    // 데이터 집어 넣기
    TextView header=(TextView) _convertView.findViewById(R.id.header);
    header.setText(m_data.header.get(_position+1));
    
    MyTextWatcher tw=(MyTextWatcher) _convertView.getTag();
    tw.setPosition(_position+1);
    EditText val=(EditText) _convertView.findViewById(R.id.val);
    val.addTextChangedListener(tw);
    
    if(_position==HEADER_TYPE_PHONE)
    {
     val.setInputType(EditorInfo.TYPE_CLASS_PHONE);
    }
    else
    {
     val.setInputType(EditorInfo.TYPE_CLASS_TEXT);
    }
 
    if(m_data.val!=null)
    {
     val.setText(m_data.val.get(_position+1));
     CLog.d("set text"+_position+" as "+m_data.val.get(_position));
    }
    
   }
   cnt++;
   return _convertView;

size가 변경되는 데이터가 있는데요

사이즈를 구해올수는 있습니다.

헌데 사이즈를 구해서 잡아놓고 한번의 view가 생성될 때 count를 ++ 하여 수를 세고

사이즈가 카운트보다 작아지면 convertView를 리턴하는 식으로 구성했습니다.

이러니 stackoverflow에러가 나버리네요.. 물론 아무것도 없는 몸통을 계속 리턴하니 이런건 알겠는데..

 

이걸 안쓰자니 outofbounds고 이걸 하면 overflow 인데.. getView는 분명 View 메소드라 그냥 return도 안먹는겁니다..

뷰 데이터 사이즈만큼 뷰를 생성후 그만 생성하려면 어떻게해야하나요?

 

위에꺼는 size체크안하고 cnt만 넣어논 상태입니다.;

 

익명사용자 님이 2015년 4월 28일 질문

1개의 답변

0 추천
getView에서 getCount의 값보다 +1을 해서 가져오는게 문제 아닌가요? getView에 position값이 넘어오는데 왜 +1을 하죠?
쎄미 (162,410 포인트) 님이 2015년 4월 28일 답변
아 설명이 부족했네요..+1은 getitemview type 이 0 일때 나오는 xml의 구성이 header와 val 을 받는 부분이 두개고(총 4개의 데이터 2쌍) 1일때부터 나오는것들은 1쌍의 데이터라 그렇습니다 독학하고 있어서 그런지 진척도느리고.. 어떻게 잡아줘야하는지 머리도 잘 안돌아가네요 ㅜㅜ
잘 안 풀릴때는 조급함을 버리고 처음부터 차근차근 하나씩 살펴보세요. 코드도 잘 정리하고, 질문도 잘 정리하다보면 답이 보일겁니다.
넵 감사합니다! 좀 더 천천히 살펴보도록하겠습니다~!
...