안드로이드 개발 질문/답변
(글 수 45,052)
A |
B |
B |
B라는 곳에 들어가는 값에따라 A라는 부분이 없는 로우가 나와야 하는데(R.layout.row)
로우의 모양을 두개의 xml로 만들어서 제가만든 어댑터의 getview에서 다음과 같이 코딩을 하였는데 이것도 아닌거 같고...
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView;
Vo vo = items.get(position);
if(v == null){
LayoutInflater li = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(vo.getA().equals("true")){
v = li.inflate(R.layout.row2, null);
TextView tv = (TextView)v.findViewById(R.id.A);
tv.setText(vo.getText());
}
else{
v = li.inflate(R.layout.row, null);
}
}
이렇게 하면 스크롤 한거에따라 결과가 계속 바뀌네요.. 나왔다 안나왔따;;
이방법 말고 생각해본게 row2에서 A라는 부분이 나와야할때마다 동적으로 그부분을 생성하거나 반대로 B만있어야할때
A라는 부분을 삭제하거나 하고싶은데 .. 어떻게 해야할지를 모르겟네요..
고수님들 가르침 좀 주세요 ㅠ
공지사항을 다 읽었음
2010.05.02 20:38:16
if(vo.getA().equals("true")){
if(v == null){
LayoutInflater li = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = li.inflate(R.layout.row2, null);
TextView tv = (TextView)v.findViewById(R.id.A);
tv.setText(vo.getText());
}
}
else{
if(v == null){
v = li.inflate(R.layout.row, null);
}
}
요렇게 하란 말씀이시죠??
이렇게도 해봤는데도 안되네요 ㅠㅠㅠ
여전히 스크롤 한거에따라서 엉키고 그래요..
holder 라는게 holder 패턴인가 뭐 그런거 이용해서 하는거 말씀하시는건가요??
그걸 이용하면 스크롤을 해도 레이아웃이 안엉킨다는 말씀이신거죠??ㅎ
2010.05.03 03:19:41
풀소스가 아니여서 정확하다고 말씀 드릴수는 없지만 이런식으로 구현하시면 될듯 합니다.
getview() 안에서
if (position==10) //특정조건을 만나면 row2 가 들어간 view 를 리턴
{
View v = new View(null);
v = myInflate1.inflate(R.layout.row2);
//Do something
return v;
}
// 일반 row 를 보여주기 위해
if (convertView == null) // row이 로드된 적이 없으면
{
convertView = myInflater2.inflate(R.layout.row,null);
// do findviewid
convertView.setTag(holder); //holder class 를 convertView로 set 함 (향후 재사용을 위해)
}
else
{
holder=(ViewHolder) convertView.getTag(); // 로드된적이 있으면 이전 convertView 를 재사용
}
// Do something
return convertView; // (row 을 리턴)
---------------------
로 직은 간단합니다.
position 으로 받아온 (또는 특정 조건이 성립하면) row2 를 리턴
그렇지 않으면 row 을 리턴.
row 는 반복 사용 되기 떄문에 holder (wrapper,cache) class 로 정의 해놓고 재사용 입니다.
holder 를 사용하는 이유는 findviewid 가 리소스를 많이 잡아먹어서(속도) 이 부분을 최소화 시키는데 있습니다.
상황에 따라서 holder 안에 findviewid 를 메소드를 넣어도 되고 getView 안에서 처리하셔도 됩니다.
getview() 안에서
if (position==10) //특정조건을 만나면 row2 가 들어간 view 를 리턴
{
View v = new View(null);
v = myInflate1.inflate(R.layout.row2);
//Do something
return v;
}
// 일반 row 를 보여주기 위해
if (convertView == null) // row이 로드된 적이 없으면
{
convertView = myInflater2.inflate(R.layout.row,null);
// do findviewid
convertView.setTag(holder); //holder class 를 convertView로 set 함 (향후 재사용을 위해)
}
else
{
holder=(ViewHolder) convertView.getTag(); // 로드된적이 있으면 이전 convertView 를 재사용
}
// Do something
return convertView; // (row 을 리턴)
---------------------
로 직은 간단합니다.
position 으로 받아온 (또는 특정 조건이 성립하면) row2 를 리턴
그렇지 않으면 row 을 리턴.
row 는 반복 사용 되기 떄문에 holder (wrapper,cache) class 로 정의 해놓고 재사용 입니다.
holder 를 사용하는 이유는 findviewid 가 리소스를 많이 잡아먹어서(속도) 이 부분을 최소화 시키는데 있습니다.
상황에 따라서 holder 안에 findviewid 를 메소드를 넣어도 되고 getView 안에서 처리하셔도 됩니다.
이 부분이 if(v == null) 안에 있으면 안됩니다. 선행되야 됩니다.
즉 if(vo.getA().equals("true")) 체크후 true 면 새로운 view 를 리턴해버리면 됩니다.
convertView를 어떤식으로 쓰냐에 따라 다르지만 일반적으로 holder 나 cache 목적으로 사용할 경우 서로 다른 레이아웃이 올경우 문제가 발생합니다. 뷰가 가지고 있는게 서로다르니 스크롤을 하다보면 레이아웃이 엉킵니다. holder를 view(layout) 수에 맞게 만들어서 사용하셔야 됩니다.