본문으로 바로가기


안녕하세요. PEACE- 에요.

안드로이드 스터디의 [여섯 번째] 글이네요.


오늘은 지난 커스텀 리스트뷰 구현( http://mailmail.tistory.com/6 )에서 구현한 각 리스트 내부의 위젯에 대한 클릭 이벤트 처리에 대해 간단하게 소개하고 넘어가겠습니다.




1. CustomListView Event Listener 구현 방법


지난 '커스텀 리스트뷰 구현' 포스팅에서 '메인액티비티-어댑터-아이템클래스'를 연결하여 커스텀 리스트뷰를 구현했습니다. 하지만 좀 더 기능적인 앱 구현을 돕기 위해 각 위젯에 대한 클릭 이벤트를 발생 시키는 방법을 알려드리려합니다.


[그림 1] 커스텀 리스트 뷰의 각 리스트의 위젯에 대한 클릭 이벤트 처리


리스너 구현 방법에 대한 방법을 설명 드리겠습니다. 커스텀 리스트뷰를 구현할때 어댑터클래스에 BaseAdapter를 상속받아 재정의 했던 메서드 중에 getView()라는 메서드가 있었습니다. 이 메서드는 생성되는 n개의 리스트 수 만큼 실행되어 각각의 위젯을 참조하고 설정합니다. 즉 커스텀 리스트뷰를 띄우기 위해 getView()를 리스트 수(addItem을 통해 저장한 아이템 수) 만큼 호출되며 호출 될때마다 지정하고 싶은 위젯에 리스너를 달아 주면 서로 다른 리스트에 서로 다른 이벤트 리스너가 실행됩니다.




2. 소스코드와 구현화면


# 구현화면


[그림 2] 각 리스트의 위젯에 대한 클릭 이벤트 처리




# 소스코드

추가된 부분은 adapter클래스의 getView()메서드 안쪽 맨 밑에 OnClickListener에 관한 부분이다.

커스텀 리스트뷰 포스팅: http://mailmail.tistory.com/6


in MyAdapter.class....

@Override
public View getView(int position, View convertView, ViewGroup parent) {

final int pos = position;
final Context context = parent.getContext();

// 'listview_custom' Layout을 inflate하여 convertView 참조 획득
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.listview_custom, parent, false);
}

// 'listview_custom'에 정의된 위젯에 대한 참조 획득
ImageView iv_img = (ImageView) convertView.findViewById(R.id.iv_img) ;
final TextView tv_name = (TextView) convertView.findViewById(R.id.tv_name) ;
final TextView tv_contents = (TextView) convertView.findViewById(R.id.tv_contents) ;

// 각 리스트에 뿌려줄 아이템을 받아오는데 mMyItem 재활용
MyItem myItem = getItem(pos);

// 각 위젯에 세팅된 아이템을 뿌려준다
iv_img.setImageDrawable(myItem.getIcon());
tv_name.setText(myItem.getName());
tv_contents.setText(myItem.getContents());

// (위젯에 대한 이벤트리스너를 지정하고 싶다면 여기에 작성하면된다..)
iv_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, pos + "번째 이미지 선택", Toast.LENGTH_SHORT).show();
}
});
tv_name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "선택: "+tv_name.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
tv_contents.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, "선택: "+tv_contents.getText().toString(), Toast.LENGTH_SHORT).show();
}
});

return convertView;
}
















댓글공감은 환영입니다.