< 개발 환경 > |
안드로이드/Android AdapterView.onItemClickListener 사용법
ListView를 사용하여 작업을 하게 되는 경우, 각각의 Row(행)에 이벤트를 걸어야 할 경우가 생기는 데요. 이럴때 보통 AdapterView.onItemClickListener 를 이용하여, 이벤트 처리를 해주게 됩니다. 하지만 보통 position 값만을 사용하여 코딩하게 되는 경우가 많은데요. 간단하게 onItemClickListener 대해서 알아보겠습니다.
우선 onItemClickListener는 CallBack Listener 입니다. 여기서 말하는 CallBack 란 무엇일까요? CallBack 이란 내가 ListView의 한 Row(행)을 클릭했을 때, 시스템 에서 내가 클릭한 것에 대한 반응을 다시 나에게 알려주는 것을 말합니다. 쉽게 말해 "내가 클릭하면, 시스템이 그에 대한 반응을 해준다" 라고 말할 수 있겠네요. ㅎㅎ 간단하죠?
그렇기 때문에 내가 ListView의 Row를 클릭했을 경우에 그 Row에 해당하는 position, view, adapterview 등을 시스템에서 나에게 전달해 주는 것입니다. 그럼 이제 이해 하기가 훨씬 쉽겠죠?ㅎ
그럼 바로 onItemClickListener 를 사용한 예제를 보겠습니다.
private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long l_position) {
// parent는 AdapterView의 속성의 모두 사용 할 수 있다.
String tv = (String)parent.getAdapter().getItem(position);
Toast.makeText(getApplicationContext(), tv, Toast.LENGTH_SHORT).show();
// view는 클릭한 Row의 view를 Object로 반환해 준다.
TextView tv_view = (TextView)view.findViewById(R.id.tv_row_title);
tv_view.setText("바꿈");
// Position 은 클릭한 Row의 position 을 반환해 준다.
Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show();
// l_Position 은 클릭한 Row의 long type의 position 을 반환해 준다.
Toast.makeText(getApplicationContext(), "l = " + l_position, Toast.LENGTH_SHORT).show();
}
};
위에서 설명한 것과 같이 ListView의 Row(행)를 클릭했을 경우, AdapterView.OnItemClickListener 인 CallBack Listener를 등록했기 때문에, 시스템에서 값을 반환해 줍니다. 그러므로 반환 되는 매가 인자를 들을 활용해서 더욱 효과적인 코딩을 할 수 있 게 됩니다.
또한 중요한 것은,!!! 커스텀 Dialog에 ListView를 사용한 구조라면, Dialog 생성자에 위의 mItemClickListener 를 넘겨줘서 처리 한다면, Dialog를 호출한 Activity 안에서 포지션 처리 할 수 가 있습니다.
또한 AdapterView.OnItemClickListener 를 메서드로 만들지 않고, implements로 구현한 클래스를 사용해서 넘겨 주셔되 됩니다.
전체 소스 입니다.
package arabiannight.tistory.com.onitemclicklistener;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class TestOnItemClickListenerActivity extends Activity {
private String[] mContents = {"사자", "여우", "곰", "호랑이", "타조"
, "말", "돼지", "사슴", "콩나물", "살쾡이", "푸우", "티몬"};
private ListView mListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mListView = (ListView) findViewById(R.id.lv_list);
mListView.setAdapter(new CustomArrayAdapter(this, R.layout.row, mContents));
mListView.setOnItemClickListener(mItemClickListener);
}
private AdapterView.OnItemClickListener mItemClickListener = new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long l_position) {
// parent는 AdapterView의 속성의 모두 사용 할 수 있다.
String tv = (String)parent.getAdapter().getItem(position);
Toast.makeText(getApplicationContext(), tv, Toast.LENGTH_SHORT).show();
// view는 클릭한 Row의 view를 Object로 반환해 준다.
TextView tv_view = (TextView)view.findViewById(R.id.tv_row_title);
tv_view.setText("바꿈");
// Position 은 클릭한 Row의 position 을 반환해 준다.
Toast.makeText(getApplicationContext(), "" + position, Toast.LENGTH_SHORT).show();
// l_Position 은 클릭한 Row의 long type의 position 을 반환해 준다.
Toast.makeText(getApplicationContext(), "l = " + l_position, Toast.LENGTH_SHORT).show();
}
};
class CustomArrayAdapter extends ArrayAdapter {
private LayoutInflater inflater = null;
private ViewHolder viewHolder = null;
public CustomArrayAdapter(Context c, int textViewResourceId,
String[] strings) {
super(c, textViewResourceId, strings);
this.inflater = LayoutInflater.from(c);
}
@Override
public int getCount() {
return super.getCount();
}
@Override
public String getItem(int position) {
return super.getItem(position);
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@Override
public View getView(int position, View convertview, ViewGroup parent) {
View v = convertview;
if(v == null){
viewHolder = new ViewHolder();
v = inflater.inflate(R.layout.row, null);
viewHolder.tv_title = (TextView) v.findViewById(R.id.tv_row_title);
v.setTag(viewHolder);
}else {
viewHolder = (ViewHolder)v.getTag();
}
viewHolder.tv_title.setText(getItem(position));
return v;
}
}
class ViewHolder {
public TextView tv_title;
}
}
//
파일첨부 :
스크린샷 :
'Android > Listview' 카테고리의 다른 글
| 안드로이드/Android ExpandableListView 만들기 - 2 - (속성 추가) (8) | 2013.02.25 |
|---|---|
| 안드로이드/Android ListView Header, Footer 설정 하기 ~! (3) | 2013.01.10 |
| 안드로이드/Android ExpandableListView 만들기 (31) | 2012.03.29 |
| 안드로이드/Android ArrayAdapter, BaseAdapter를 이용한 ListView 구현 (3) | 2012.03.28 |
| 안드로이드/Android Custom ListView CheckBox 모두 선택 하기 (6) | 2011.11.30 |
TestOnItemClickListener.zip