< 개발 환경 > |
안드로이드/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 |