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

android visibility 문제 질문합니다.

+1 추천

 

<FrameLayout
        android:id="@+id/overlay"
        android:visibility="gone" >
</FrameLayout>
 
현재 이런식으로 구성된 item 레이아웃이 있고
 
본문 listview에 inflater로 item에 추가해줘서 사용하고있습니다
 
그리고 클릭하게되면 overlay가 visible상태가 되죠
public void onClick(View v) {
if (ck(entity.getId())) {
overlay.setVisibility(View.VISIBLE);
} else {
overlay.setVisibility(View.GONE);
}
}

이렇게 true시 overlay가 보여지고  false시 gone상태가 됩니다 뱃지형식으로 나타나게됩니다.

헌데 listview에서 아래쪽으로 스크롤후 (해당 아이템이 화면에서 사라질때까지)

다시 위로 스크롤하면 뱃지형식의 이미지가 사라집니다 true상태인데 말이죠 ㅠㅠ 어떻게하죠 ?

아무리 찾아봐도 알아서 false가 되지도 않는데 왜 이럴까요 ?

홍그리 (1,560 포인트) 님이 2013년 2월 20일 질문
회색님이 2013년 2월 21일 태그 변경

2개의 답변

+2 추천
 
채택된 답변
ListView  의 getView 에서 내부의 row 를 구성하는 View를 재사용하면서 생기는 문제입니다.
상인 (6,670 포인트) 님이 2013년 2월 20일 답변
상인님이 2013년 2월 27일 수정
답변 감사합니다. 해당 뷰를 재사용전에 부터 제어를 해줘야되는거죠 ?
Adapter 의 getView 사용 패턴을 검색해보세요. 아래 얼룩돼지님의 서술 코드가 그런 관점입니다.
 
조금 더 첨언하자면, 재사용할때 findViewById 를 사용하게되는데 ViewHolder 패턴을 사용하면 스크롤 반응성이 약간 더 개선됩니다. 이론상 15%라고 합니다. 리스트의 열의 뷰의 복잡도가 높을수록 효과가 좋습니다.
0 추천

뷰자체를 가져와서 컨트롤 한다는 개념보다는

 

뷰속성 변경값을 컨트롤한다는 개념으로 보셔야합니다.

 

커스텀 아답터 쓰신다면 이런식이 되겠네요.

 

private class GroupAdapter extends ArrayAdapter<Object> {
	private ArrayList<Data> item;
	private Data temp;

	public GroupAdapter(Context ctx, int resourceID, ArrayList item) {
		super(ctx, resourceID, item);

		this.item = item;

	}

	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.overlay, null);
		}
		temp = item.get(position);

		if (temp != null) {

			// List Item control
			FrameLayout overlay = (FrameLayout)v.findViewById(R.id.overlay);
                        overlay.setVisibility(temp.visibility);

		}

		return v;
	}
}

class Data{

        int visibility;

        Data(int visibility){
                this.visibility = visibility;
         }
}

 

 

이렇게 구성하고 ListView에서 아이템 클릭될때

arrayList.remove(position);

arrayList.add(position, new Data(View.VISIBLE or View.GONE));

groupAdater.notifyDataSetChanged();

이런식으로 데이터 속성값만 바꿔주고 리스트 새로고침하면 될거에요

얼룩돼지 (15,720 포인트) 님이 2013년 2월 21일 답변
얼룩돼지님이 2013년 2월 21일 수정
감사합니다 ㅠㅠ 좋은답변이었습니다.
...