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

ArrayAdapter 내의 버튼을 통한 View 제어 방법

0 추천

안녕하세요. 그림과 같은 기능을 구현 중에 있습니다.

좌측 X 버튼을 터치시, 우측의 아이콘들이 토글됩니다.

개발중이라서 아이콘은 그냥 아무거나 가져다 쓴 상황인데요, 일단 왼쪽의 X 버튼을 누르면 오른쪽의 아이콘이 위, 아래 그림으로 변하는 것을 구현하려고 합니다.

 

소스는 대충 다음과 같습니다

public class CustomAdapter extends ArrayAdapter<ArrayItemForArrayAdapter> {

ArrayList<ArrayItemForArrayAdapter> data;
ItemHolder holder;
int mode = 1;

//생성자, 초기화 과정 등은 생략하겠습니다.
// 중요한 부분만 적을게요

@Override
	public View getView( int position, View convertView, ViewGroup parent ) {
   View view = ~;
   holder = new ItemHolder();
   holder.button.setOnClickListener( new View.OnClickListener() {
 @Override
   void onClick( View v ) {
      if ( mode == 1 ) {
        mode = 2;
        holder.toggle1.setVisibility(INVISIBLE);
        holder.toggle2.setVisibility(VISIBLE);
      } else if ( mode == 2 ) {
        mode = 1;
        // 위와는 반대
      }
    }
  });
  return view
 }

 class ItemHolder {
   ImageView button, toggle1, toggle2;
 }

}

이런, 생으로 썼더니 들여쓰기가 잘 안 되네요. 

 

아무튼 아시는 분은 잘 아실 거라고 생각합니다.... 저렇게 어댑터를 만들고, 메인의 리스트뷰에 철썩 붙였습니다.

문제는 저 상태에서 어느 row의 버튼을 클릭을 하든지, 내가 누른 row의 아이콘이 토글되는 것이 아니고, position이 MAX인, 즉 마지막 row의 아이콘이 토글됩니다.

가령 3개의 줄이 있다고 칠 때 1번째 줄의 X를 누르면 1번이 아닌 3번 줄의 그림이 바뀌고, 2번을 눌러도 역시 3번, 3번을 누르면 당연히 3번이 바뀝니다. 이걸 어떻게 해결해야 할지 모르겠네요.

 

BaseAdapter를 쓸 경우에는 ArrayList에 뷰 클래스를 붙이고 리스트에 접근해서 바로 고칠 수가 있는데, ArrayAdapter를 쓰니까 도통 접근할 방법이 없네요. 그렇다고 BaseAdapter에 붙인 리스트에서 리스너를 주면 정상적으로 동작하질 않구요. 그러니까 ArrayAdapter 내부에서 처리를 해야 할 것 같은데, 어떻게 하면 좋을지 명안을 부탁드립니다.

SHODAN (260 포인트) 님이 2014년 2월 3일 질문

1개의 답변

0 추천
객체에다가 mViewType을 선언하시고  getItemViewType을 오버라이드하셔서 X버튼을 클릭시 mViewType을 0이라고줬으면 1로 바꿔주시면 됩니다.
whdrb19 (23,520 포인트) 님이 2014년 2월 3일 답변
죄송하지만 좀 더 자세하게 설명 부탁드릴 수 있을까요?
getView 함수는 화면에 보여지는 row 수 만큼 호출됩니다...
3개면 3번이 호출될거게요..
그때마다 holder = new ItemHolder();  를 호출하니.. 결국 제일 마지막 row의 정보만 접근하게 되는거같군요
추가로.. viewholder는 view를 재활용할때 findviewbyid같은 비용이 많이드는 함수를 적게 호출하기위해 쓰는데요.. list에 item이 100개 넘는다고해도
item은 화면에 보여지는 갯수정도만 생성하고 스크롤하면 만들어진 view를 재활용하게 됩니다.. 그때마다 getview함수가 호출되죠.. 구글링하시면 더 많은 정보가 있을꺼에요..ㅎ
http://stackoverflow.com/questions/11645160/listview-rows-with-different-layouts 여기보시면 자세한 코드설명이나와있습니다.
코드에나온대로짠다음 X버튼을 클릭하면 itemtype값을 바꿔준다음 notifyDataSetChanged 하면 되겠죠?
...