안녕하세요.
앱 하나를 개발중에 있는데 구글링을 통해 겨우겨우 완성단계에 도달되어 가는데~
이놈에 리스트뷰 하나때문에 엄청고생중이네요.
비슷한 경우들을 더러 봤는데 이런 경우들은 잘 없으신거 같아서 도움을 좀 구하고자 합니다.
//List의 row를 변형하기 위해 Adapter 오버라이딩
private class XmlListAdapter extends ArrayAdapter<Object> {
private ArrayList<XmlData> items;
@SuppressWarnings("unchecked")
public XmlListAdapter(Context context, int textViewResourceId, ArrayList items){
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent){
View v = convertView;
if(v ==null){
LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
XmlData xmlData = (XmlData)items.get(position); // 1
if(xmlData != null){
tv1 = (TextView)v.findViewById(R.id.custsearch_custcd);
tv2 = (TextView)v.findViewById(R.id.custsearch_custnm);
tv3 = (TextView)v.findViewById(R.id.custsearch_telno1);
tv4 = (TextView)v.findViewById(R.id.custsearch_hphoneno1);
tv5 = (TextView)v.findViewById(R.id.custsearch_address);
if(tv1 !=null){
tv1.setText(xmlData.d_CustCd);
tv2.setText(xmlData.d_CustNm);
tv3.setText(xmlData.d_TelNo1);
tv4.setText(xmlData.d_HphoneNo1);
tv5.setText(xmlData.d_Address);
}
}
return v;
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id){
super.onListItemClick(l, v, position, id);
↓ 2
TextView tv = (TextView)l.getChildAt(position).findViewById(R.id.custsearch_custcd);
((GlobalFunc)getApplicationContext()).mCustCd = (String)tv.getText();
Intent intent5 = new Intent(CustSearch.this, Customer.class);
startActivity(intent5);
}
우선 커스텀 리스트뷰로 구성하였습니다.
상기 데이타는 풀파싱을 통해서 웹에서 xml 을 가져와 뿌려주는데에까지는 아무런 지장이 없습니다.
어떤 문제가 발생하냐 하면
현재 갤럭시Tab 을 가지고 테스트중에 있는데 리스트뷰가 한 화면에 뿌려주는게 8줄 입니다.
1번에서 0~7번까지 position 이 나타나는건 디버깅통해서 확인했습니다.
그리고 0~7번줄중 아무거나 클릭하였을시에 2번에서 정상적으로 position 값을 가져와서 원하는 값을 추출합니다.
근데 리스트뷰에서 스크롤 하여 밑으로 내려갔을 경우에 position 의 값이 8부터 스크롤 되어지는곳까지
늘어나는것도 확인되고 setText로 데이터가 들어가는것도 확인하였는데
희안하게 한화면이 벗어난 값부터는 2번에서 계속적으로 오류가 발생합니다.
디버그에는
ZygoteInit$MethodAndArgsCaller.run() line: 864
ZygoteInit.main(String[]) line: 616
NativeStart.main(String[]) line: not available [native method]
검색해보니 어댑터 내 버튼같은것에 focus를 주지 말라는 그런것들이 있긴한데...
검색이야 뭐... 다 해보셨을테구.....
다른 방법으로 어댑터의 getView() 부분에
다음과 같이 클릭리스너를 넣는건 어떨가요?...
제가 이렇게 해서 사용하고 있는데... 문제없이 잘 되고 있어서요~~
tv1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
}
}
오류가 난다고 하신
TextView tv = (TextView)l.getChildAt(position).findViewById(R.id.custsearch_custcd);
이 코드에서 문제는 l.getChildAt(position) 이부분인데요.
리스트뷰의 child는 어뎁터에 설정한 리스트 전체를 가지고 있지 않고
화면에 보이는만큼, 여기서는 항상 8개의 child만을 가지고 있습니다.
이것은 Log로 l.getChildCount() 를 찍어보시면 확인하실 수 있습니다.
그러므로 원인은 position이 child의 수보다 크므로 outOfArray가 되는것이겠지요.
해결책은 onListItemClick(ListView l, View v,
int
position,
long
id) 을 보시면 인자에 View v가 있습니다.
l.getChild(position)해서 뽑으시려는게 클릭된 View, 결국 인자로 넘어온 View v 일 것이므로
TextView tv = (TextView)v.findViewById(R.id.custsearch_custcd);
하시면 되지 않을까 생각합니다. (테스트는 안해봄..)
답변주신 하나 하나의 글들 감사합니다
손을 다쳐 입원하는 바람에 글확인이 좀 늦었습니다
월요잃 출근하여 말씀하신 부분들 확인하여
답글 올리도록 하겠습니다~
좋은 주말들 되세요^^
★ 답변
굿모닝우유님 감사합니다~
TextView tv = (TextView)l.getChildAt(position).findViewById(R.id.custsearch_custcd);
받아오는 인자값을 굳이 포지션의 값으로 찾지않아도 된다는걸 알았습니다
말씀해주신대로
TextView tv = (TextView)v.findViewById(R.id.custsearch_custcd);
로 하니 정확하게 값을 받아왔습니다. 사람 한명 살리셨습니다...
별거 아닌 부분인데 기초기 부족해서 그런거 같습니다. 좀 더 기본에 충실하게 해야할거 같습니다^^;
답변주신 LOVE님 말씀대로 로그도 추가하였습니다
backma님 말씀도 주석처리하여 예외적으로 발생할때 참고할수 있도록 메모 해놓았습니다
답변주신분들 감사합니다.
1번에서 0~7번까지 position 이 나타나는건 디버깅통해서 확인했습니다.
그리고 0~7번줄중 아무거나 클릭하였을시에 2번에서 정상적으로 position 값을 가져와서 원하는 값을 추출합니다.
근데 리스트뷰에서 스크롤 하여 밑으로 내려갔을 경우에 position 의 값이 8부터 스크롤 되어지는곳까지
늘어나는것도 확인되고 setText로 데이터가 들어가는것도 확인하였는데
희안하게 한화면이 벗어난 값부터는 2번에서 계속적으로 오류가 발생합니다.
----------------------------------------------------------------------
이 부분이 무슨소리인지 잘 모르겠습니다.
한 화면에 리스트뷰의 ROW가 7개가 나오는데 그때까지는 이상없다가(클릭 리스너를 발생시켜도)
화면을 스크롤 하고 클릭 리스너를 발생시키면 그때 문제가 발생한다는 것인가요?
LOG는 왜 이용을 안하시나요?^^;; 안되면 log찍어보는게 최고입니다.